2016-05-11 12 views
1

私は新しいと中古車のテーブルを持っている:発注結果

id country  status car 
1 Australia new  Honda 
2 Australia used Alfa Romeo 
3 Australia used Jaguar 
4 Australia used BMW 
5 Belgium  new  BMW 
6 Belgium  new  Citroen 
7 Belgium  used Honda 

私はこのような結果を表示し、その後、国ごとにそれぞれ使用して、新しい車の数をカウントしたいと思います:

言い換えれば
country  new     used 
Australia 1 new: Honda   3 used including Alfa Romeo 
Belgium  2 new including BMW 1 used: Honda  

、存在する場合、複数の「新しい」か(優先順位付けされたIDによって、)最初車名を文字列にそれらをCONCATし、国ごとに「使用」。

これは私のコードです:

SELECT t1.country, 
CASE 
    WHEN LENGTH(group_concat(t1.status)) - LENGTH(REPLACE(group_concat(t1.status), "new", "")) = 1 THEN CONCAT("1 new: ", t1.car) 
    WHEN LENGTH(group_concat(t1.status)) - LENGTH(REPLACE(group_concat(t1.status), "new", "")) > 1 THEN CONCAT(LENGTH(group_concat(t1.status)) - LENGTH(REPLACE(group_concat(t1.status), "new", "")), " new including ", t1.car) 
    ELSE '' 
END as new, 
CASE 
    WHEN LENGTH(group_concat(t1.status)) - LENGTH(REPLACE(group_concat(t1.status), "used", "")) = 1 THEN CONCAT("1 used: ", t1.car) 
    WHEN LENGTH(group_concat(t1.status)) - LENGTH(REPLACE(group_concat(t1.status), "used", "")) > 1 THEN CONCAT(LENGTH(group_concat(t1.status)) - LENGTH(REPLACE(group_concat(t1.status), "used", "")), " used including ", t1.car) 
    ELSE '' 
END as noms 
from table1 t1 
group by t1.country 

はしかし、これらは私の結果、次のとおりです。これらの結果は

country  new      used 
Australia 1 new: Honda    3 used including Honda 
Belgium  2 new including BMW  1 used: BMW 

、複数の「新規」または「使用」は国ごとがあれば、状態にかかわらず、最初の車を表示しているだけです。

複数の結果がある場合はのステータスでファーストカーを表示するにはどうすればよいですか?

答えて

1

このクエリhereを確認できます。

SELECT country, 
    CASE 
    WHEN COUNT(IF(status = 'new', id, NULL)) = 1 THEN CONCAT('1 new: ', GROUP_CONCAT(IF(status = 'new', car, NULL))) 
    WHEN COUNT(IF(status = 'new', id, NULL)) > 0 THEN CONCAT(COUNT(IF(status = 'new', id, NULL)), ' new including ', SUBSTRING_INDEX(GROUP_CONCAT(IF(status = 'new', car, NULL) ORDER BY id SEPARATOR ';'), ';', 1)) 
    ELSE 'no new cars' 
    END AS new_cars, 
    CASE 
    WHEN COUNT(IF(status = 'used', id, NULL)) = 1 THEN CONCAT('1 used: ', GROUP_CONCAT(IF(status = 'used', car, NULL))) 
    WHEN COUNT(IF(status = 'used', id, NULL)) > 0 THEN CONCAT(COUNT(IF(status = 'used', id, NULL)), ' used including ', SUBSTRING_INDEX(GROUP_CONCAT(IF(status = 'used', car, NULL) ORDER BY id SEPARATOR ';'), ';', 1)) 
    ELSE 'no used cars' 
    END AS used_cars 
FROM cars 
GROUP BY country 

あなたはGROUP_CONCATORDER BYSEPARATORを使用することができます。最初の車が必要ですか? ORDER BY idSUBSTRING_INDEXを使用し、最初の車を抽出するのに適切なセパレータを使用してください。

+0

パーフェクト、感謝10億。 – huey

関連する問題