想象一下一个舞会,我们将男生排在一边,女生排在另一边。每个男孩都被放入表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 |
-------------------------
我可以通过使用带有唯一索引的临时表来获得这些结果,但是我正在寻找一个查询来给出没有临时表的结果,因为这个查询的实际应用程序是针对两侧数百万行的
答案 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