MYSQL“每行排除,但只有一次”加入

时间:2011-08-17 20:46:00

标签: mysql join

想象一下一个舞会,我们将男生排在一边,女生排在另一边。每个男孩都被放入表A,一次,只有一次。同样对表B中的女孩来说。

然后,我们希望将A中的男孩与B中的女孩匹配一次,而B中的女孩也需要匹配A中的一个男孩。

A将有一个ID列作为主键,b_id将保存与之匹配的女孩的ID,如果尚未匹配,则为NULL。

对于女孩来说,B会有同样的。

表格如下所示:

table A (boys)
---------
|id|b_id|
---------
| 1|NULL|
| 2|NULL|
| 3|NULL|
| 4|NULL|
| 5|NULL|
| 6|NULL|
---------


table B (girls)
---------
|id|a_id|
---------
| 1|NULL|
| 2|NULL|
| 3|NULL|
| 4|NULL|
| 5|NULL|
| 6|NULL|
---------

什么类型的查询会匹配一个且只有一个男孩与一个且只有一个尚未匹配的女孩?结果看起来像这样:

results
-------------------------
|a.id|a.b_id|b.id|b.a_id|
-------------------------
|   1| NULL |   1| NULL |
|   2| NULL |   2| NULL |
|   3| NULL |   3| NULL |
|   4| NULL |   4| NULL |
|   5| NULL |   5| NULL |
|   6| NULL |   6| NULL |
-------------------------

我可以通过使用带有唯一索引的临时表来获得这些结果,但是我正在寻找一个查询来给出没有临时表的结果,因为这个查询的实际应用程序是针对两侧数百万行的

1 个答案:

答案 0 :(得分:3)

SELECT boyUnmatched.id  AS aid
     , NULL             AS b_id   --- you really don't need these two
     , girlUnmatched.id AS bid 
     , NULL             AS a_id   --- columns, do you?
FROM
    ( SELECT @rownuma := @rownuma+1 AS rank
           , id 
      FROM a
         , (SELECT @rownuma :=0) AS dummy
      WHERE b_id IS NULL
      ORDER BY id
    ) AS boyUnmatched
  JOIN
    ( SELECT @rownumb := @rownumb+1 AS rank
           , id 
      FROM b
         , (SELECT @rownumb :=0) AS dummy
      WHERE a_id IS NULL
      ORDER BY id
    ) AS girlUnmatched
  ON boyUnmatched.rank = girlUnmatched.rank