mysql-只在列包含特定值的地方选择一些内容,而不选择其他内容

vyu0f0g1  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(283)

我有一个messages\u 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
jyztefdp

jyztefdp1#

我们可以尝试使用带有 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));

下面是一个演示的链接,演示了上述逻辑的工作原理:

演示

0ve6wy6x

0ve6wy6x2#

您需要的条件是:

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;
dsekswqp

dsekswqp3#

对于每个“与朋友的对话”,必须只有两行具有相同的 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);

请参见演示

相关问题