2017-06-19 3 views
2

Mein Problem ist das nächste.MySQL bekommen Paare von Zeilen aus dem gleichen Satz von Fremdtabelle

Ich habe 3 Tabellen: Menschen, Autos und Driven:

Menschen:

Id  Name 
1 | Tom 
2 | James 
3 | Charles 
4 | Eric 
5 | Thomas 
6 | Robert 
7 | Kim 
8 | Ellias 

Cars:

Id  Name 
1 | Ford 
2 | Nissan 
3 | Hyundai 

Driven:

PID CID (People ID & Car ID) 
1 | 1 
2 | 1 
5 | 1 
5 | 2 
6 | 1 
6 | 2 
7 | 1 
7 | 2 
7 | 3 
8 | 1 

ich abrufen möchten Paare von Menschen, die fahren en das gleiche Set von Autos. Ich meine: wenn Tom nur Ford fährt und James auch NUR Ford fährt, möchte ich dieses Paar Tom/James als Ergebnis zurückgeben. Auch ich möchte Paare von Leuten einschließen, die kein Auto gefahren haben (dh. Charles/Eric (0 Autos gefahren beide)).

Das Abfrageergebnis mit dem obigen Beispiel sollten zwei Spalten pro Ergebnis zurückgeben, zum Beispiel:

Name  Name  
Tom  | James  (Only Ford) 
Tom  | Ellias (Only Ford) 
James | Ellias (Only Ford) 
Charles | Eric  (None BOTH) 
Thomas | Robert (Ford and Nissan BOTH) 

Beachten Sie auch, dass Kim Ford, Nissan und Hyundai angetrieben hat. Also wird Kim nicht mit irgendjemandem paaren. Tom James und Ellias sind alle Ford gefahren, also sind sie ein Paar mit sich.

Ich habe versucht mit kartesischen Produkt und relationale Abteilung, aber ich habe keine Lösung gefunden. Wenn mir jemand wenigstens mit einem Trinkgeld helfen kann, werde ich wirklich dankbar sein. Vielen Dank!

+1

Können Sie Charles und Eric in Beispieldaten und das richtige erwartete Ergebnis hinzufügen. Auch nach dem dritten Datensatz in 'Drived' Tabelle,' Tom' fuhr 'Nissan' auch, aber warum haben Sie erwähnt * Tom drived nur Ford * –

+0

behoben und fügen Sie das ganze Beispiel – ricaso

+0

versuchen Sie diese SELECT GROUP_CONCAT (p.name) als Menschen , c.name aus gefahren als d join Leute wie p auf p.id = d.PID beitreten Auto wie c auf c.id = d.CID Gruppe von d.CID – Shibon

Antwort

1

können Sie die folgende Abfrage verwenden:

SELECT p.Id, p.Name, 
      COALESCE(GROUP_CONCAT(c.Name ORDER BY c.Name), 'None') AS cars_driven 
FROM People AS p 
LEFT JOIN Driven AS d ON p.Id = d.PID 
LEFT JOIN Cars AS c ON c.Id = d.CID 
GROUP BY p.Id, p.Name; 

die Liste der Autos pro Person gefahren zu bekommen.

Ausgang:

Id Name cars_driven 
----------------------- 
1 Tom  Ford 
2 James Ford 
3 Charles None 
4 Eric None 
5 Thomas Ford,Nissan 
6 Robert Ford,Nissan 
7 Kim  Ford,Hyundai,Nissan 
8 Ellias Ford 

Unter Verwendung der obigen Abfrage zweimal als abgeleitete Tabelle, die Sie das gewünschte Ergebnis bekommen:

SELECT t1.Name, t2.Name, t1.cars_driven 
FROM ( 
    SELECT p.Id, p.Name, 
      COALESCE(GROUP_CONCAT(c.Name ORDER BY c.Name), 'None') AS cars_driven 
    FROM People AS p 
    LEFT JOIN Driven AS d ON p.Id = d.PID 
    LEFT JOIN Cars AS c ON c.Id = d.CID 
    GROUP BY p.Id, p.Name) AS t1 
JOIN ( 
    SELECT p.Id, p.Name, 
      COALESCE(GROUP_CONCAT(c.Name ORDER BY c.Name), 'None') AS cars_driven 
    FROM People AS p 
    LEFT JOIN Driven AS d ON p.Id = d.PID 
    LEFT JOIN Cars AS c ON c.Id = d.CID 
    GROUP BY p.Id, p.Name 
) AS t2 ON t1.Id < t2.Id AND t1.cars_driven = t2.cars_driven; 

Ausgang:

Name Name cars_driven 
---------------------------- 
Tom  James Ford 
Charles Eric  None 
Thomas Robert Ford,Nissan 
Tom  Ellias Ford 
James Ellias Ford 

Demo here

+0

Genau das, was ich brauche. Du rockst dir so sehr! – ricaso

Verwandte Themen