2011-08-17 40 views
2

試想一個舞會,我們排隊另一側的男孩和女孩。每個男孩一次只能放入表A中。同樣地,對於女孩子表B.MYSQL「每一行排除在外,但只有一次」加入

然後我們要在B中的女孩一次且僅一次匹配A中的男孩,同樣B中需要的女生,以配合一個和A.只有一個男孩

A將有一個ID列作爲主鍵,並且將舉行與它們相匹配的女孩,還是空的ID,如果沒有相匹配的B_ID。

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

讓我指出這是夜間正常化。你應該有第三張關係表。 – Randy

+1

無論規範化問題如何,爲什麼你們不是這個問題的人?想象一下,如果每個人都把這麼多的努力放在他們的問題上,生活會是多麼容易! –

回答

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 
+0

我真的很喜歡這個答案的內容和風格。 –

+0

這回來沒有結果。請注意,你別名男孩和女孩,但表名是a和b。我刪除了別名,並在下面的數據集上運行了查詢並且沒有得到任何結果。我發佈了sql來創建和填充下面評論中的表格(一個評論不會包含所有內容)。 –

+0

CREATE TABLE IF NOT EXISTS'A'( 'id' INT(11)NOT NULL AUTO_INCREMENT, 'b_id' INT(11)DEFAULT NULL, PRIMARY KEY('id') )ENGINE = MyISAM的默認字符集= LATIN1 AUTO_INCREMENT = 13; INSERT INTO'A'('id','b_id')VALUES (1,NULL), (2,NULL), (3,NULL), (4,NULL), (5,NULL) , (6,NULL), (7,NULL), (8,NULL), (9,NULL), (10,NULL), (11,NULL), (12,NULL); –

相關問題