簡體   English   中英

MySQL-僅在列包含特定值的情況下選擇其他內容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM