2016-03-16 173 views
0

我試圖用這個連接返回多行用戶ID,他們被發現在另一個表中的特定行的收件人列表中。MySQL JOIN只返回第一個匹配

SELECT a.`USER_ID` 
FROM Users a 
INNER JOIN Lists b ON a.`USER_ID` = b.`RECIP` 
WHERE a.`PARENT` = '1' 
AND b.`LIST_ID` = '210' 

上面的查詢將返回5行,因爲在RECIP 5場比賽,但我只看到1分的結果是在RECIP

在表中「列表」,排在第一場比賽LIST_ID 「210」 RECIP包含'22,33,40,42,45' 因此,我希望查詢從該表返回5行‘用戶’,因爲所有這些USER_ID的的存在:

USER_ID 22

USER_ID 33

USER_ID 40

USER_ID 42

USER_ID 45

但我只得到一個結果:

USER_ID 22

我已經嘗試了一些東西(SELECT DISTINCT ...,GROUP BY a.ID),但我沒有取得進展。說實話,我仍然試圖讓我的頭靠近聯接。

任何人都可以建議嗎?

+1

這'b.ID =「210''是從'Lists'表限制匹配的記錄的謂詞。 –

+0

是的,我想你想在'a'而不是'b'中過濾ID。 – shawnt00

回答

0

的問題是,recip字段包含數s列表爲'22,33,40,42,45'。如果該字符串與a.USER_ID = b.RECIP中的數字相匹配,則字符串將被評估爲數字22,因爲逗號不是mysql中有效數字表達式的一部分,所以mysql在第一次逗號時停止計算字符串。

最好的解決方案是標準化您的數據結構並將每個值存儲在recip的自己的記錄中。

快速解決方案是使用find_in_set()函數在聯接表達式:

SELECT a.`USER_ID` 
FROM Users a 
INNER JOIN Lists b ON find_in_set(a.`USER_ID`,b.`RECIP`)>0 
WHERE a.`PARENT` = '1' 
AND b.`LIST_ID` = '210' 
+0

太好了,謝謝。 RECIP值很小,但我需要設計一個更有效的解決方案,因爲一些RECIP列表目前包含超過10,000個ID – ArtMan

+0

如上所述,最好的解決方案是規範化數據結構。我的猜測是你遵循了快速解決方案。 – Shadow

+0

暫時是的。但是我保證我會規範化數據結構以獲得長期利益! :) – ArtMan

0

您正在篩選上只有一行在你的第二個表,因爲這樣:

AND b.`ID` = '210' 

下列之一應該工作,這取決於你的數據,你還沒有顯示任何內容:

SELECT a.`ID` 
FROM Users a 
INNER JOIN Lists b ON a.`ID` = b.`RECIP` 
WHERE a.`PARENT` = '1' 

SELECT a.`ID` 
FROM Users a 
LEFT JOIN Lists b ON a.`ID` = b.`RECIP` 
WHERE a.`PARENT` = '1'