【问题标题】:Mysql IN condition for and operationsMysql IN条件for和操作
【发布时间】:2016-02-17 09:37:50
【问题描述】:

我有包含用户 ID 和专业知识 ID 的专业知识表。每个用户可能具有多种专业知识。现在我想获得所有必须具有范围内所有专业知识的用户,例如(1,2,3,4,5,......等等)。

IN 条件仅用于 OR 操作,所以我怎样才能获得预期的结果,让我们说通过将 IN 条件与 AND 操作一起使用。或者有没有其他可以使用的运算符或技巧。

编辑:

让我补充一点解释。客户选择物理、数学、化学......等专业。所以我有专业知识,我需要从满足所有选定专业知识的专业知识表中获取所有用户 ID。所以我需要精通数学、物理、化学等的用户。

所有数据都在一个专业知识表中。

当前查询是这样的

从specialty_id IN (1,2,3,4)中选择user_id

但这适用于拥有这些专业知识之一的所有用户,但我需要所有拥有所有这些专业知识的用户。

【问题讨论】:

  • 你可以使用 All 运算符
  • 如果我对您的理解正确,您所问的问题在逻辑上是不可能的。例如,记录的属性不能同时是 12。我认为您正在寻找exists
  • 好吧,让我解释一下,用户必须具备物理、数学、化学等所有专业知识。所以不需要那些只有物理没有数学的记录。
  • 我们怎么知道有多少专业知识?
  • 嗯,我有一个用户勾选专业知识的界面,所以我有一个数组。我知道确切的专业知识数量。例如 (1,2,3,54,5)

标签: mysql sql database


【解决方案1】:

如果我理解正确,您希望返回的所有 user_id 都具有 IN 子句中的所有专业知识(可能还有更多)。

如果是这样,请选择 users_id,按用户 ID 分组并计算匹配的 DISTINCT 专业知识 ID。返回与您要搜索的 id 数量相同的用户的 users_id。

SELECT user_id 
FROM expertise 
WHERE expertise_id IN (1,2,3,4)
GROUP BY user_id
HAVING COUNT(DISTINCT expertise_id) = 4

【讨论】:

  • 谢谢。我仍在尝试寻找可能失败或边缘情况但可以正常工作的情况。
【解决方案2】:

您可以验证与您的列表匹配的专家数量,并要求该数量等于您列表的大小。这是一个示例,当您的所需专业知识列表包含 5 个元素时:

SELECT *
FROM   users
WHERE  5 = (SELECT COUNT(DISTINCT expertise_id)
            FROM   user_expertises
            WHERE  user_id = users.user_id
            AND    expertise_id IN (1, 2, 3, 13, 18))

如果可以确定 user_expertise 表没有重复的 (user_id, knowledge_id) 对,则可以将 DISTINCT expertise_id 替换为简单的 *

当然,您必须使用正确的表名和列名。这只是一个模板。

【讨论】:

  • 我可能是这样的选择 user_id from knowledge where knowledge_id IN(1,2,3,5)
猜你喜欢
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 2012-07-15
  • 1970-01-01
相关资源
最近更新 更多