mysql - 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
解决方案
你想要的条件是:
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;
推荐阅读
- javascript - 流程:无法获取...因为对象文字中缺少属性...
- statistics-bootstrap - 如何在 r 中执行不同类型的引导程序?
- tsql - 在特定条件下生成字符串
- open-liberty - 无法使用 Open Liberty 18.0.0.4 构建可运行 Jar
- c# - 在 C:\Programs 文件中引用 dll 而不复制它
- python - 如何在matplotlib中设置三维轴之外的图例?
- javascript - jQuery FormBuilder:当屏幕折叠小于 482 像素时,有什么方法可以防止字段菜单转换为图标?
- django - 如何解决我的 CPU 利用率问题,我正在使用带有 nginx、uwsgi 和 django 的 ubuntu ec2 实例
- kubernetes - k8s pvc 中的 aws-efs “ProvisioningFailed - 没有卷插件匹配”
- java - 在方法中从 1-10 生成 3 个随机数字的问题