2016-08-29 14 views
0

私は10個のテーブルを親キーで通信しています。私が必要とするすべての情報を引き出そうとしています。SQL:複数のテーブルからの選択

これは私が今使っているクエリです:

SELECT a.date_in, a.date_out, b.name, b.phone, b.birthdate, 
b.country, b.hotel, b.room_nr, b.passport_nr, c.email, 
d.size, e.name, GROUP_CONCAT(g.service), GROUP_CONCAT(h.service) 
, GROUP_CONCAT(i.time), GROUP_CONCAT(j.location) 
FROM reservation a, rider b, user c, 
bike_size d, bike e, services_reservation f, services g, 
bike_shipping h, bike_shipping_reservation i 
, bike_shipping_location j WHERE a.rider_id = b.id 
AND b.user_id = c.id AND a.bike_size_id = d.id AND 
d.bike_id = e.id AND a.id = f.reservation_id AND 
f.services_id = g.id 
AND h.id = i.bike_shipping_id AND a.id = i.reservation_id 
AND i.bike_shipping_location_id = j.id 
AND a.id = 80 

問題は、私はGROUP_CONCAT機能を使用するすべての列が、何回も重複してしまうことがあります。たとえば:

GROUP_CONCAT(g.service) column 
Road SPD,Road SPD,Bike Helmet,Bike Helmet,TT Bar,TT Bar,Garmin Edge 
810,Garmin Edge 810 

は、私はそれを修正することができますどのように

Road SPD,Bike Helmet,TT Bar,Garmin Edge 810 

任意のアイデアすべきですか?私のデータベーススキームは良いですか?

SQLFiddle: http://sqlfiddle.com/#!9/8bc033/33

+0

を使用して、これを試してみてくださいあなたのためのMySQLのタグが追加されましたが、それに忘れないようにしてください将来他のSQL質問をするときに特定のデータベースを指定してください。 – sstan

答えて

1

あなたGROUP_CONCAT文でDISTINCTを使用する

SELECT a.date_in, a.date_out, b.name, b.phone, b.birthdate, 
b.country, b.hotel, b.room_nr, b.passport_nr, c.email, 
d.size, e.name, GROUP_CONCAT(DISTINCT g.service), GROUP_CONCAT(DISTINCT h.service) 
, GROUP_CONCAT(DISTINCT i.time), GROUP_CONCAT(DISTINCT j.location) 
FROM reservation a, rider b, user c, 
bike_size d, bike e, services_reservation f, services g, 
bike_shipping h, bike_shipping_reservation i 
, bike_shipping_location j WHERE a.rider_id = b.id 
AND b.user_id = c.id AND a.bike_size_id = d.id AND 
d.bike_id = e.id AND a.id = f.reservation_id AND 
f.services_id = g.id 
AND h.id = i.bike_shipping_id AND a.id = i.reservation_id 
AND i.bike_shipping_location_id = j.id 
AND a.id = 80 
+0

ありがとうございます – Speedwheelftw

+0

私の答えがあなたを助けてくれたら歓迎してください。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Matt

+0

それは言う:「あなたは答えを受け入れることができます4分 " – Speedwheelftw

0

GROUP_CONCAT

、IN DISTINCT
SELECT a.date_in, a.date_out, b.name, b.phone, b.birthdate, 
b.country, b.hotel, b.room_nr, b.passport_nr, c.email, 
d.size, e.name, GROUP_CONCAT(DISTINCT g.service), GROUP_CONCAT(DISTINCT h.service) 
, GROUP_CONCAT(DISTINCT i.time), GROUP_CONCAT(DISTINCT j.location) 
FROM reservation a, rider b, user c, 
bike_size d, bike e, services_reservation f, services g, 
bike_shipping h, bike_shipping_reservation i 
, bike_shipping_location j WHERE a.rider_id = b.id 
AND b.user_id = c.id AND a.bike_size_id = d.id AND 
d.bike_id = e.id AND a.id = f.reservation_id AND 
f.services_id = g.id 
AND h.id = i.bike_shipping_id AND a.id = i.reservation_id 
AND i.bike_shipping_location_id = j.id 
AND a.id = 80 
+0

あなたは彼のSQLのフィドルでこれを試しましたか? g.serviceとh.serviceがグループ化され、一意のフィールドの文字列を連結する代わりに、h.serviceとg.serviceの組み合わせの数に行が複製されます。 – Matt

+0

@Matt私はフィドルを試していませんでした。あなたは申し訳ありません。私は別個の値を見つける代わりにグループ分けを行います。修正済み –

+0

これで正しいですが、私はすでに質問に答える前にそれに答えていました。 – Matt

関連する問題