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

b1zrtrql  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(281)

我在mysql中有一个名为 table1 它有三列 id , user_id (外键)和 destination_id (外键)。一个用户可以有多个目的地。

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]);

我只想从表1中获取所有的用户id,当且仅当特定的用户id包含所有请求的目的地时。
我试着用“in”操作符来实现这个。即

SELECT user_id FROM table1 WHERE destination_id IN ($requestedDestinationsInCommaSeparatedString)

它给出了一行,包括用户标识8和用户标识10,但我只需要用户标识10。我只是想知道关于下列问题的解决方案的概念。我是sql的初学者,任何帮助都是值得赞赏的。谢谢。

5w9g7ksd

5w9g7ksd1#

通过对目的地进行分组和计数,可以检查用户标识是否引用了所有请求的目的地。

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)

为此,用户标识和目标标识的字段组合在所有记录中必须是唯一的。

agyaoht7

agyaoht72#

我唯一能想到的就是使用多个子选择并在php中构建查询字符串。
因此,对于您的特定示例,生成的sql查询字符串应该是

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

我认为编程生成中间部分的函数应该不太难。

相关问题