[英]MySQL - Select something ONLY where columns contain specific values, and nothing else
我有一個messages_users表,其中包含參與對話的用戶:
conversationId | userId
由於目的是多個用戶可以進行對話,因此一行等於一個用戶。
對話有兩種類型:與朋友對話和與多個用戶的分組對話。 他們與眾不同的只是其中的人數。
2位用戶=與朋友交談
3個或更多=分組的對話
我想允許用戶通過其ID(此處為1和2)與他們的朋友打開對話。 因此,我需要制作一條SQL語句,僅檢索這兩個用戶所在的會話ID。
如果這樣做,我將獲得這兩個用戶所在的所有對話(例如,如果有與他們分組的對話)
SELECT convId FROM messages_users WHERE userId IN (1,2)
我嘗試了這個,但是不起作用:
SELECT convId FROM messages_users WHERE userId IN (1,2) HAVING COUNT(userId) = 2
也嘗試過此方法,但仍然可以使我與他們進行的每一次對話:
SELECT convId FROM messages_users a INNER JOIN messages_users b ON a.convId = b.convId WHERE a.userId = 1 AND b.userId = 2
您想要的條件是:
SELECT mu.convId
FROM messages_users mu
GROUP BY mu.convId
HAVING SUM(CASE WHEN mu.userId = 1 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN mu.userId = 2 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN mu.userId NOT IN (1, 2) THEN 1 ELSE 0 END) = 0;
您不能在 GROUP BY
之前進行過濾,因為如果在對話中,那么您將錯過對用戶“ 3”的計數。 第三個條件阻止“ 3”參與。
在MySQL中,可以簡化為:
SELECT mu.convId
FROM messages_users mu
GROUP BY mu.convId
HAVING SUM( mu.userId = 1 ) > 0 AND
SUM( mu.userId = 2 ) > 0 AND
SUM( mu.userId NOT IN (1, 2) ) = 0;
我們可以嘗試使用帶有EXISTS
子句的自聯接操作:
SELECT DISTINCT mu1.convId
FROM messages_users mu1
INNER JOIN messages_users mu2
ON mu1.convId = mu2.convId
WHERE
(mu1.userId = 1 AND mu2.userId = 2) AND
NOT EXISTS (SELECT 1 FROM messages_users mu
WHERE mu.convId = mu1.convId AND userID NOT IN (1, 2));
這是一個演示的鏈接,顯示了以上邏輯的工作原理:
對於每次“ 與朋友的交談 ”,必須只有2行具有相同的convId
:
SELECT convId
FROM messages_users
GROUP BY convId
HAVING COUNT(userId) = 2;
如果您想要用戶1和2的“ 與朋友交談 ”:
SELECT DISTINCT convId FROM messages_users
WHERE
(userId IN (1, 2))
AND
convId IN
(SELECT convId
FROM messages_users
GROUP BY convId
HAVING COUNT(userId) = 2);
觀看演示
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.