如何在Where子句中使用IN查找确切的行匹配?

时间:2018-12-19 05:58:57

标签: mysql sql chat

我有两个表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 |
+----+---------+--------+

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

我使用了IN子句,但是它不起作用。

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

尽管结果为空,但它同时返回两个组。

6 个答案:

答案 0 :(得分:0)

我们可以尝试将INSERT INTO ... SELECTEXISTS子句一起使用,该子句断言userId的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表中。

答案 1 :(得分:0)

SELECT DISTINCT groupId FROM tbl_members WHERE userId = '2'
INTERSECT
SELECT DISTINCT groupId FROM tbl_members WHERE userId = '3'

答案 2 :(得分:0)

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

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) */

答案 3 :(得分:0)

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

确保只有在2和3不在同一组中重复时,此方法才有效。

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

答案 4 :(得分:0)

第一个内部查询将确定所有提取的组只有两个成员,这些成员将减少不必要的记录集,然后第二个内部查询获取该组的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

答案 5 :(得分:-1)

我认为此查询将给出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;