我有两个表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)
尽管结果为空,但它同时返回两个组。
答案 0 :(得分:0)
我们可以尝试将INSERT INTO ... SELECT
与EXISTS
子句一起使用,该子句断言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;