如何在where子句中找到精确的行匹配?

9fkzdhlc  于 2021-06-15  发布在  Mysql
关注(0)|答案(6)|浏览(370)

我有两张tabletbl\ U组和tbl\ U成员。这是两个表的快照。

+----+------------+
| 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 |
+----+---------+--------+

现在我想用userid3,2再创建一个组,但在此之前,我想检查是否有任何组具有相同的成员3和2,而不是任何其他成员。
我用了in子句,但它不起作用。

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

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

lnvxswe2

lnvxswe21#

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

ih99xse12#

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

bgibtngc3#

我们可以试着用 INSERT INTO ... SELECT 带着一个 EXISTS Assert 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 新组的表。

r55awzrz

r55awzrz4#

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

e3bfsja25#

一种方法是使用基于条件聚合的过滤 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) */
3ks5zfa0

3ks5zfa06#

这将返回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

相关问题