2016-11-28 18 views
1

Ich habe eine einzelne Tabelle, die ich mit sich selbst verbinden muss, aber jeder Eintrag muss mit jedem Eintrag in der Tabelle außer sich selbst verbunden werden.MySQL Join jeder Zeile mit jeder Zeile außer sich

Beispiel:

my_table 
tableId name 
1  John 
2  Dave 
3  Bob 

Ausgabe von beitreten:

tableIdA nameA tableIdB nameB 
1  John 2  Dave 
1  John 3  Bob 
2  Dave 1  John 
2  Dave 3  Bob 
3  Bob 1  John 
3  Bob 2  Dave 

Wie würde ich einen solchen Ausgang erreichen?

Antwort

3

Sie können eine CROSS JOIN verwenden, um alle Kombinationen zu erhalten. Dann verwenden Sie eine Klausel WHERE Kombinationen zwischen den gleichen Reihen heraus zu filtern:

SELECT t1.*, t2.* 
FROM mytable AS t1 
CROSS JOIN mytable AS t2 
WHERE t1.Id <> t2.ID 
+0

Wenn a, b id dasselbe wie b, a ist, dann wird dies jede Kombination zweimal erhalten. – Strawberry

+1

@Strawberry Ich denke, das ist auch die Absicht des OP. –

+2

@Strawberry: Sie spielen auf Permutationen an, während OP nach Kombinationen fragte, wie in ihrer erwarteten Ausgabe bestätigt. – onedaywhen

1

Sie Cross-Join verwenden können und beseitigen gleiche Reihen mit denen:

SELECT 
    tbl1.id AS tableIdA, 
    tbl1.name AS nameA, 
    tbl2.id AS tableIdB, 
    tbl2.name AS nameB 
FROM 
    my_table tbl1, 
    my_table tbl2 
WHERE 
    tbl1.id != tbl2.id 
0

Ich bin versucht zu sagen:

SELECT tableIdA, nameA, tableIdB, nameB 
    FROM (SELECT tableId AS tableIdA, name AS nameA FROM my_table) AS A 
     NATURAL JOIN 
     (SELECT tableId AS tableIdB, name AS nameB FROM my_table) AS B 
    EXCEPT 
    SELECT tableId AS tableIdA, name AS nameA, 
     tableId AS tableIdB, name AS nameB 
    FROM my_table; 

... dann erinnere ich mich, dass mySQL EXCEPT/MINUS noch nicht unterstützt!

Dies könnte einer der seltenen Situation, wo ihr olde INNER JOIN attraktiver ?:

sieht
SELECT tableIdA, nameA, tableIdB, nameB 
    FROM (SELECT tableId AS tableIdA, name AS nameA FROM my_table) AS A 
     INNER JOIN 
     (SELECT tableId AS tableIdB, name AS nameB FROM my_table) AS B 
     ON tableIdA <> tableIdB; 
1

Ein ganz normaler INNER JOIN, aber specifiy! = In der Klausel ON

SELECT a.tableId AS tableIdA , 
     a.name AS nameA , 
     b.tableId AS tableIdB , 
     b.name AS nameB 
FROM my_table a 
INNER JOIN my_table b 
ON a.tableId != b.tableId 

Wenn Sie jede Kombination nur einmal verwenden möchten (unabhängig davon, in welcher Richtung sie sich befinden), können Sie sie verwenden.>

Verwandte Themen