MySQL将每行连接到除自身之外的每一行

时间:2016-11-28 13:42:00

标签: mysql join

我有一个表需要连接到自己,但每个条目都需要连接到表中的每个条目,除了它自己。

示例:

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

我如何实现这样的输出?

4 个答案:

答案 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()