2012-07-02 11 views
7

ich eine Tabelle mit zwei Spalten:Mysql Wählen reziproke Paare von Datensätzen, ohne Duplikate

  1. person_id
  2. person_id mit dem id 1. Feld in Zusammenarbeit

Ich brauche alle auswählen Zusammenarbeit Paare, ist es einfach, aber in was ist das Problem: Tabelle haben Daten wie: 987 - 102, 103 - 104, 104 - 103, 21 - 102. Als Ergebnis mit solchen Daten sollte ich 3 Kooperationspaare haben 987 - 102, 103-104, 21-102, wie Sie sehen 103 - 104 und 104 - 103 Datensätze haben die gleiche Logik, wie kann ich vermeiden, duplizieren von ihnen. Irgendeine Idee?

Vielen Dank und viele Grüße. Anton.

+0

Zeigen Sie uns Ihre Tabellenstruktur –

+0

PERSON_ID int (10), QUESTION_ID int (10) TEXT_ANSWER Text, ich glaube zweite colomn ist nicht nötig, denn in dieser Frage, ich es in WHERE-Klausel verwenden –

Antwort

10

könnten Sie MySQL verwenden LEAST() und GREATEST() Funktionen zusammen mit DISTINCT:

SELECT DISTINCT LEAST(a, b), GREATEST(a, b) FROM mytable 
+1

wenn Sie nur das Paar haben ' (2,1) 'es wird es ausgeben als (1,2)' – alfasin

+1

@alfasin: Die Problembeschreibung impliziert, dass sie gleichwertig sind. Andernfalls sollte das OP klären, wie entschieden wurde, welche der "(103,104)" und "(104,103)" beibehalten und welche verworfen werden sollten. – eggyal

+0

@eggyall: Sie haben Recht, es wird kein Hinweis gegeben, wie die Bestimmung gemacht wurde, dass "(103,104)" anstelle von "(104,103)" zurückgegeben werden sollte. Aber die Reihenfolge der Elemente in den anderen "Paaren" zu behalten könnte in einigen Fällen wichtig sein. Wenn beispielsweise diese Ergebnismenge (Unterabfrage) erneut mit der Tabelle verknüpft wird, werden andere Spalten aus der Zeile abgerufen. Die untere Zeile ist, dass die Reihenfolge der Elemente in dem Paar wichtig sein könnte (und uns wird nicht gesagt, dass dies nicht der Fall ist). Die Spezifikation gibt ein Beispiel für eine Ergebnismenge. Ihre Abfrage gibt eine Ergebnismenge zurück, die von der Spezifikation abweicht. – spencer7593

3

Wenn in jedem „Paar“, um die Reihenfolge der Elemente zu bewahren ist nicht wichtig, finden Sie in der Antwort von eggyal. Diese Abfrage gibt eine Ergebnismenge zurück, die sich geringfügig von der von Ihnen angegebenen unterscheidet. Sie gibt das Paar 102-987 anstelle von 987-102 zurück. Es entfernt auch alle "doppelten" Paare, die in der Tabelle erscheinen.

Wenn die Reihenfolge der Elemente in jedem Paar ist wichtig, und Sie möchten die "kleiner - größer" statt "größer - kleiner", wenn beide dieser "passenden" Paare vorhanden sind, die Sie können diese so etwas wie:

SELECT c.col1, c.col2 
    FROM mytable c 
    LEFT 
    JOIN mytable d ON d.col1 = c.col2 AND d.col2 = c.col1 AND d.col1 <> d.col2 
WHERE (d.col1 IS NULL OR d.col1 > c.col1) 

zu beseitigen alle doppelten Paaren und „matching“ Paare, fügen Sie eine GROUP BY-Klausel oder das Schlüsselwort distinct, zB

SELECT c.col1, c.col2 
    FROM mytable c 
    LEFT 
    JOIN mytable d ON d.col1 = c.col2 AND d.col2 = c.col1 AND d.col1 <> d.col2 
WHERE (d.col1 IS NULL OR d.col1 > c.col1) 
GROUP BY c.col1, c.col2 

NOTES:

SQL Fiddle hier: http://sqlfiddle.com/#!2/1d9e7/1 und hier: http://sqlfiddle.com/#!2/1d9e7/2

Die Vergleichsoperatoren sind nicht null-Safe, können sie die Suchresultates nicht zurückkehren Sie wollen, wenn entweder col1 oder col2 enthält einen NULL-Wert. (Die Abfrage könnte geändert werden, um NULL-Werte für Spalte1 und/oder Spalte2 zu behandeln.) Wie beschrieben, würden beide Abfragen z. B. beide (1,NULL) und (NULL,1) zurückgeben, wenn diese "übereinstimmenden" "Paare" in der Tabelle sind. (Es läuft auf die Frage hinaus, ob NULL-Werte berücksichtigt werden sollen oder nicht.)

Beachten Sie auch, dass beide Abfragen Zeilen zurückgeben, in denen col1=col2.

Beachten Sie, dass die erste Abfrage NICHT "doppelte" Zeilen eliminiert, die in der Tabelle vorhanden sind. Das heißt, wenn ein doppeltes "Paar", z. B. (202,101), in zwei verschiedenen Zeilen erscheint, werden beide zurückgegeben (es sei denn, die Abfrage gibt mindestens eine Zeile mit einem "übereinstimmenden" Paar zurück: (101,202).)

Es war nicht klar, welche Ergebnismenge in diesen Fällen zurückgegeben werden sollte, daher zeigt die erste Abfrage das Muster für die Beseitigung von NUR Zeilen (larger,smaller), wenn ein passendes Paar (smaller,larger) im Resultset enthalten ist.

Die zweite Abfrage eliminiert ALLE Duplikate und "übereinstimmende" Paare.