我尝试使用此联接返回多行用户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),但我没有取得任何进展。说实话,我仍然试图让我的头脑加入。
有人可以提供建议吗?
答案 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'