2016-03-28 8 views
2

Ich habe seit einigen Tagen nach einer Lösung für mein Problem gesucht. Alles, was ich versuche, liefert unerwünschte Ergebnisse.Wie mehrere Zeilen zu vergleichen, die Duplikate in allen Spalten außer einer haben, und die andere Spalte anzuzeigen, in SQL

Im Grunde versuche ich, Zeilen aus der gleichen Tabelle zu vergleichen. Lassen Sie uns sagen, dass dies die Tabelle in Frage:

name | hobby 
------+------------ 
Bill | fishing  <- 1 
Bill | basketball <- 2 
Bill | tennis  <- 3 
Peter | soccer 
Peter | baseball 
Joe | tennis  <- 3 
Joe | basketball <- 2 
Peter | fishing 
Dave | tennis 
Joe | fishing  <- 1 
Dave | fishing 
Dave | basketball 
Dave | football 

Was ich möchte, dass meine Abfrage Rückkehr haben, ist eine Tabelle, die die Namen von zwei Personen zeigt, die genau die gleichen Hobbys, und die Menge an Hobbys sie haben in verbreitet. Es darf den gleichen Namen nicht zweimal in einer Zeile anzeigen. Wenn wir die Abfrage auf diese Tabelle auszuführen, würde das Ergebnis sein:

name1 | name2 | nr_of_hobbies 
--------+-----------+---------------- 
Bill | Joe  | 3 
Joe  | Bill | 3 

Ich habe versucht, alle Arten von Anfragen, schließt sich mit, Unterabfragen, eine Mischung davon, aber ich habe einfach nicht in der Lage gewesen, traf den Nagel auf den Kopf. Mir fällt es besonders schwer, herauszufinden, wie man mehrere Elemente einer Spalte vergleicht, wobei Elemente aus anderen Spalten gleich sind. Jede Hilfe würden wir sehr schätzen. Danke im Voraus!

Antwort

2

Versuchen Sie folgendes:

SELECT t1.name, t2.name, 
     (SELECT COUNT(*) 
     FROM mytable AS t 
     WHERE t.name = t1.name) AS t1_count, 
     (SELECT COUNT(*) 
     FROM mytable AS t 
     WHERE t.name = t2.name) AS t2_count   
FROM mytable AS t1 
INNER JOIN mytable AS t2 ON t1.hobby = t2.hobby 
WHERE t1.name <> t2.name 
GROUP BY t1.name, t2.name 
HAVING COUNT(*) = t1_count AND COUNT(*) = t2_count 

Demo here

+0

Danke Giorgos. Das war genau die Antwort, nach der ich gesucht habe! –

+0

@ 7z. . . . Ich verstehe nicht, wie dies die Antwort ist, nach der Sie suchen. Ihre angegebene Antwort hat drei Spalten - zum Beispiel - und dies hat vier. –

+0

@GordonLinoff Ja, das ist richtig, aber das ist nicht der Kern dessen, was ich tun wollte. Ich wollte vor allem verstehen, wie man in einer Spalte nach mehreren Werten sucht, für die Werte in einer anderen Spalte gleich sind. Ihre Antwort war ebenfalls hilfreich, aber ich selbst hatte noch nie zuvor von Group_Concat gehört oder gehört. Es war insofern hilfreich, weil Sie meinen Horizont dahingehend erweitert haben, was ich mit SQL erreichen kann, aber es hat die Dinge nicht so intuitiv gemacht, wie Giorgos 'Antwort es getan hat. Daher wählte ich seine Antwort. –

3

In MySQL ist der einfachste Weg, group_concat() zu verwenden. Hinweis: Diese legt die Namen in der gleichen Spalte:

select group_concat(name) as names, hobbies 
from (select name, group_concat(hobby order by hobby) as hobbies 
     from t 
     group by name 
    ) n 
group by hobbies 
having count(*) > 1; 

Sie können mit join das gleiche tun, wenn Sie Paare wollen:

select n1.name as name1, n2.name as name2 
from (select name, group_concat(hobby order by hobby) as hobbies 
     from t 
     group by name 
    ) n1 join 
    (select name, group_concat(hobby order by hobby) as hobbies 
     from t 
     group by name 
    ) n2 
    on n1.hobbies = n2.hobbies and n1.name <> n2.name; 
+1

Ich würde n1.name <> n2.name in der Join-Bedingung hinzufügen. – Shadow

+0

Vielen Dank! Behält diese Methode im Hinterkopf. Ich habe die andere Antwort als Lösung gewählt, weil ich in erster Linie verstehen wollte, welche Unterabfragen ich für die Suche in mehreren Zeilen verwenden musste. Ungeachtet, gute Antwort. –

Verwandte Themen