我在MySQL中有一个名为table1
的表,该表具有三列id
,user_id
(foreign_key)和destination_id
(foreign_key)。一个用户可以有多个目的地。
E.g Table1
id user_id destination_id
1 10 2
2 5 3
3 10 4
4 10 5
5 9 10
6 5 12
7 8 2
我用PHP脚本从客户端收到请求;该请求在数组中包含目标ID。
E.g. $request = array('destination_id' => [2,4,5]);
仅当特定的user_id包含所有请求的目的地时,我才想从table1中获取所有的user_id。
我试图使用'IN'运算符来实现这一点。 即
SELECT user_id FROM table1 WHERE destination_id IN ($requestedDestinationsInCommaSeparatedString)
它给出的行包括user_id 8和user_id 10,但我只需要user_id10。我只是想知道有关以下问题的解决方案的概念。我是SQL的初学者,任何帮助都将不胜枚举。谢谢。
答案 0 :(得分:6)
您可以通过对目的地进行分组和计数来检查user_id是否引用了所有请求的目的地。
SELECT user_id
FROM table1
WHERE
destination_id IN (2,4,5)
GROUP BY
user_id
HAVING count(*) = 3
-- count must be the number of elments in (2,4,5)
为此,user_id和destination_id的字段组合在所有记录中必须是唯一的。
答案 1 :(得分:0)
我唯一能想到的就是使用多个子选择并在PHP中构建查询字符串。
因此对于您的特定示例,生成的SQL-Query-String应该为
SELECT user_id
FROM table1
WHERE user_id IN
(SELECT user_id FROM table1 WHERE destination_id = 2)
AND user_id IN
(SELECT user_id FROM table1 WHERE destination_id = 4)
AND user_id IN
(SELECT user_id FROM table1 WHERE destination_id = 5)
GROUP BY user_id
我认为对为您生成中间部分的功能进行编程应该不太困难。