如何在同一列中找到具有多个不同值的结果?

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

假设我们有一个带有logs表和types表的数据库。我想做一个查询,找出userx是否有特定类型日志的条目。假设userx已经登录 type_1 以及 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

qeeaahzv

qeeaahzv1#

一个带有条件聚合的选项。

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
qxgroojn

qxgroojn2#

我不建议使用 count(distinct) 为此目的。它可能很贵。我只想做:

SELECT l.userId
FROM logs l INNER JOIN
     types t
     ON t.id = l.type_id
WHERE t.name IN ('type_1', 'type_2', 'type_3')
GROUP BY l.userId
HAVING SUM(t.name = 'type_1') > 0 AND  -- at least one
       SUM(t.name = 'type_2') > 0 AND  -- at least one
       SUM(t.name = 'type_3') = 0 ;    -- none
lc8prwob

lc8prwob3#

您可以像vamsi那样做,但是如果您喜欢更易于理解的sql,那么您可以这样做:

SELECT * FROM logs AS l
INNER JOIN types AS t
ON t.id = l.type_id
WHERE true 
AND EXISTS (SELECT 1 FROM logs ll WHERE l.user_id = ll.user_id AND type_id = 1)
AND EXISTS (SELECT 1 FROM logs ll WHERE l.user_id = ll.user_id AND type_id = 2)
AND NOT EXISTS (SELECT 1 FROM logs ll WHERE l.user_id = ll.user_id AND type_id = 3)

相关问题