我有一个表需要连接到自己,但每个条目都需要连接到表中的每个条目,除了它自己。
示例:
my_table
tableId name
1 John
2 Dave
3 Bob
加入输出:
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
我如何实现这样的输出?
答案 0 :(得分:3)
您可以使用CROSS JOIN
来获取所有组合。然后使用WHERE
子句过滤掉相同行之间的组合:
SELECT t1.*, t2.*
FROM mytable AS t1
CROSS JOIN mytable AS t2
WHERE t1.Id <> t2.ID
答案 1 :(得分:1)
您可以使用交叉连接并消除相等的行,其中:
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
答案 2 :(得分:1)
只需使用正常的INNER JOIN,但在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
如果你只想要每个组合一次(无论它们是哪个方向),你可以使用&gt;
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
答案 3 :(得分:0)
我很想说:
EXCEPT
...然后我记得mySQL还不支持MINUS
/ INNER JOIN
!
这可能是你们 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;
看起来更有吸引力的罕见情况之一?:
Array.prototype.map()