2016-08-29 5 views
0

Ich habe 10 Tabellen, die zwischen ihnen mit Elternschlüsseln kommunizieren und ich versuche, alle Informationen herauszuziehen, die ich brauche.SQL: SELECT von mehreren Tabellen

Dies ist die Abfrage, die ich jetzt bin mit:

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 

Das Problem ist, dass alle Spalten, in denen ich GROUP_CONCAT Funktion zu verwenden, oft dupliziert bekommen. Zum Beispiel:

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

sollte

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

Irgendwelche Ideen sein, wie ich es beheben kann? ist mein Datenbankschema gut?

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

+0

Added die MySQL-Tag für Sie verwenden, aber versuchen Sie nicht zu vergessen, Spezifizieren Sie Ihre spezifische Datenbank, wenn Sie in Zukunft weitere SQL-Fragen stellen. – sstan

Antwort

1

Verwenden DISTINCT in Ihrem GROUP_CONCAT Aussagen

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

danke es funktioniert – Speedwheelftw

+0

Ihre Begrüßung, wenn meine Antwort Ihnen geholfen hat, bitte in Betracht ziehen, es zu akzeptieren. Hier ist ein Link wie/wann/warum: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Matt

+0

Es sagt: "Sie können eine Antwort in annehmen 4 Minuten " – Speedwheelftw

0

Try this DISTINCT IN GROUP_CONCAT

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

Hast du das in seiner Sql-Geige versucht? Dies funktioniert nicht, g.service und h.service werden dann Gruppierungen und anstatt die Strings dieser Felder eindeutig zu verketten, werden die Zeilen auf die Anzahl der Kombinationen von h.service und g.service repliziert. – Matt

+0

@Matt Ich habe nicht versucht, auf fiddle.yes tut mir leid tut mir leid, ich mache Gruppierungen statt verschiedene Werte zu finden.Korrigiert –

+0

So jetzt ist es richtig, aber ich hatte bereits beantwortet, bevor Sie die Frage beantworten. – Matt