【问题标题】:How to find exact row match using IN in Where clause?如何在 Where 子句中使用 IN 查找精确的行匹配?
【发布时间】:2018-12-19 05:58:57
【问题描述】:

我有两个表 tbl_group 和 tbl_members。 这是两张表的快照。

+----+------------+
| id | groupTitle |
+----+------------+
|  1 | Group 1    |
|  2 | Group 2    |
+----+------------+

+----+---------+--------+
| id | groupId | userId |
+----+---------+--------+
|  1 |       1 |      1 |
|  2 |       1 |      2 |
|  3 |       1 |      3 |
|  4 |       2 |      1 |
|  5 |       2 |      2 |
+----+---------+--------+

现在我想再创建一个用户 ID 为 3,2 的组,但在此之前我想检查是否有任何组具有相同的成员 3 和 2 而不是其他任何组。

我用过 IN 子句,但它不起作用。

SELECT DISTINCT groupId 
FROM tbl_members 
WHERE userId IN (3,2)

虽然结果为空,但它正在返回两个组。

【问题讨论】:

  • 有没有相同成员 3 和 2 的组??如果是,那是什么,如果不是,那又是什么??
  • 如果有任何组具有相同的成员,那么结果应该是那个 groupId,如果没有这样的组,那么结果应该是空的。

标签: mysql sql chat


【解决方案1】:

我们可以尝试将INSERT INTO ... SELECTEXISTS 子句一起使用,该子句断言userId of 2/3 尚未出现在任何组中。

INSERT INTO tbl_members (groupId, userId)
SELECT groupId, userId
FROM (
    SELECT 3 AS groupId, 2 AS userId UNION ALL SELECT 3, 3
) t
WHERE NOT EXISTS (SELECT 1 FROM tbl_members
                  WHERE userId IN (2, 3)
                  GROUP BY groupId
                  HAVING MIN(userId) <> MAX(userId));

您还必须在 tbl_group 表中为新组插入一条新记录。

【讨论】:

  • 谢谢你的时间,但HAVING MIN(userId) &lt;&gt; MAX(userId) 的目的是什么?
  • EXISTS 子查询非常规范,您可以在整个网站上找到它。 HAVING 子句检查我们是否在一个组中找到了两个不同的值,此外,WHERE 子句因此意味着我们在该组中找到了 2 和 3。
  • 我正在使用 MySQL,但是这个查询没有被正确解析。 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE NOT EXISTS (SELECT 1 FROM tbl_members WHERE userId IN (2, 3) GROUP BY grou' at line 2
  • 我不知道为什么会出现错误。我已经更新了我的答案,如果您有兴趣,可以尝试其他方法。
  • 当然让我试试这个!!
【解决方案2】:
SELECT DISTINCT groupId FROM tbl_members WHERE userId = '2'
INTERSECT
SELECT DISTINCT groupId FROM tbl_members WHERE userId = '3'

【讨论】:

  • 这似乎相当不切实际
  • 这个答案来自低质量的帖子。即使代码是不言自明的,也要添加一些解释
【解决方案3】:

一种方法是使用GROUP BYHAVING 子句使用基于条件聚合的过滤。我们将使用查询来获取 groupId 值,它的 userId 值只有 3 和 2。如果查询没有返回任何这样的值;这意味着不存在这样的组;因此您可以创建组。

SELECT
  groupId
FROM tbl_members 
GROUP BY groupId
HAVING SUM(userId = 2) AND /* userID 2 exists */
       SUM(userId = 3) AND /* userID 3 exists */
       NOT SUM(userId NOT IN (2,3)) /* No other userId exists (other than 2,3) */

【讨论】:

    【解决方案4】:

    这将返回 groupId,其中只有 2 和 3 在组中。 组中所有 userId 的计数 - 如果组中没有其他 userid,则 userId = 2 或 3 的记录的总和必须为 0。

    当然,只有当 2 和 3 不在同一组中重复时,这才有效。

    SELECT groupId
    FROM tbl_members
    GROUP BY groupId
    HAVING COUNT(userId)-SUM(userId IN (2,3)) = 0
    

    【讨论】:

      【解决方案5】:

      第一个内部查询将决定所有获取的组只有两个成员,这将减少不必要的记录集,然后第二个内部查询获取该组 id 并检查该组中是否没有其他成员然后 3,2,最后是整个查询将给出只有 3,2 作为成员的组 id。

      SELECT groupId 
      FROM tbl_members m
       WHERE m.userId IN (3,2) AND 
      (SELECT COUNT(memberId) FROM tbl_members mmm WHERE mmm.groupId=m.groupId)=2 AND 
      (SELECT COUNT(memberId) FROM tbl_members mm WHERE mm.groupId=m.groupId AND 
      m.userId NOT IN (3,2))<=0 
      GROUP BY groupId
      

      【讨论】:

        【解决方案6】:

        我认为这个查询将给出userid (2,3)、groupid (2,3) 中的值组 从表

        SELECT count(1), userid ,groupid  FROM tbl_members 
        WHERE groupid IN (3,2) and userid in (3,2)
        group by  userid, groupid;
        

        【讨论】:

          猜你喜欢
          • 2023-04-02
          • 2019-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-21
          • 1970-01-01
          • 1970-01-01
          • 2016-02-01
          相关资源
          最近更新 更多