mysql - 如何在同一列上找到具有多个不同值的结果?
问题描述
想象一下,我们有一个带有日志表和类型表的数据库。我想做一个查询,以确定 UserX 是否有某些类型的日志的条目。假设 UserX 已登录type_1
and type_2
,但未登录type_3
。我想写一个简单的查询来看看这是对还是错。
起初我尝试了类似的东西:
SELECT * FROM logs AS l
INNER JOIN types AS t
ON t.id = l.type_id
WHERE t.name = "type_1"
AND t.name = "type_2"
AND t.name != "type_3";
但我很快意识到不可能这样做,因为t.name
不能有多个值。我现在尝试了很多不同的方法,但似乎找不到适合我的方法。我确定解决方案相当简单,只是目前我还没有看到。
希望有人能指出我正确的方向。
我在这个小提琴中制作了一个简单的测试数据库,用于测试和示例:https ://www.db-fiddle.com/f/nA6iKgCcJwKnXKsxaNvsLt/0
解决方案
一种带有条件聚合的选项。
SELECT l.userID
FROM logs AS l
JOIN types AS t ON t.id = l.type_id
GROUP BY l.userID
HAVING COUNT(DISTINCT CASE WHEN t.name IN ('type_1','type_2') THEN t.name END) = 2
AND COUNT(DISTINCT CASE WHEN t.name = 'type_3' THEN t.name END) = 0
推荐阅读
- spring-boot - 如何在同一服务的 Spring Boot 应用程序实例之间启用缓存?
- c++ - 如何解决 Arduino 程序中的“类型无效操作数”?
- ios - Storyboards 如何推送嵌套导航控制器?
- sql - 如何从未嵌套的表中左连接?
- javascript - 在下拉选择值显示隐藏的输入字段
- ruby-on-rails - 如何在将代码部署到 Heroku 服务器之前将文件添加到项目中
- java - Kafka 消费者是否默认批量大小?
- cron - vtiger cron 对不起!尝试访问受限文件
- python-3.x - 如何在 FastAPI 中使用带路由的中间件
- javascript - 减少第三方代码的影响 - Google CDN