MySQL JOIN仅返回第一个匹配项

时间:2016-03-16 16:28:22

标签: mysql join

我尝试使用此联接返回多行用户ID,并将其发现在另一个表中特定行的收件人列表中。

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),但我没有取得任何进展。说实话,我仍然试图让我的头脑加入。

有人可以提供建议吗?

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分:0)

问题是recip字段包含列表中的数字'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'