首页 > 解决方案 > MySQL - 只选择列包含特定值的东西,没有别的

问题描述

我有一个 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

标签: mysqlsqlconditional-statements

解决方案


你想要的条件是:

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;

推荐阅读