【问题标题】:How to select particular column from table if another column includes all the set of requested values?如果另一列包含所有请求值集,如何从表中选择特定列?
【发布时间】:2018-08-08 14:12:27
【问题描述】:

我在 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_id 10。我只是想知道关于以下问题的解决方案的概念。我是 SQL 的初学者,任何帮助都会非常明显。谢谢。

【问题讨论】:

  • 您最好向我们展示您是如何从该数组创建$requestedDestinationsInCommaSeparatedString
  • 在您的情况下,您不能使用 IN,因为 IN 会告诉查询查找适合您提供的任何 destination_id 的任何 user_id。
  • 我能否检查一下您的意思是不是真的如果特定的 user_id 包含 所有 请求的目的地
  • 看这个,尼拉杰。看起来和你的问题一模一样:stackoverflow.com/questions/15977126/…
  • @RiggsFolly: $requestedDestinationsInCommaSeparatedString 只是表示将请求的目标数组转换为字符串的结果,以便它适合 mysql 中的 IN 运算符。例如:在上面的场景中,它是 $requestedDestinationsInCommaSeparatedString = "2,4,5"。

标签: php mysql sql


【解决方案1】:

您可以通过对目的地进行分组和计数来检查 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 的字段组合在所有记录中必须是唯一的。

【讨论】:

  • 谢谢,我会试试这个方法。
  • 谢谢@Henrik :)
【解决方案2】:

我唯一能想到的就是使用多个子选择并在 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

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

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 2018-04-19
    • 2021-09-15
    • 2022-12-09
    相关资源
    最近更新 更多