如果另一列包含所有请求值集,如何从表中选择特定列?

时间:2018-08-08 14:12:28

标签: php mysql sql

我在MySQL中有一个名为table1的表,该表具有三列iduser_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的初学者,任何帮助都将不胜枚举。谢谢。

2 个答案:

答案 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

我认为对为您生成中间部分的功能进行编程应该不太困难。