我不确定是否可以这样做,我有一个用户表,其中有一个用户活动的相关表连接在一个外键上。活动有不同的类型,例如评论等等。我需要按照每种不同活动类型的数量来过滤用户。
到目前为止我所拥有的是:
SELECT
users.*,
COUNT(t1.id) AS comments,
COUNT(t2.id) AS likes
FROM users
LEFT JOIN activity AS t1 ON users.id = t1.user_id
LEFT JOIN activity AS t2 ON users.id = t2.user_id
WHERE t1.activity_type_id = 1 AND t2.activity_type_id = 2
GROUP BY users.id
HAVING comments >= 5 AND likes >= 5
这似乎很接近,但它正在返回一个数量为5的用户,无论是喜欢还是评论,实际上用户有5个喜欢和1个评论。
要明确我希望此查询返回有5个或更多喜欢的用户以及还有 5个或更多评论的用户。
更新
我创建了一个SQL小提琴。在这种情况下,我有3个用户:
我希望查询只返回用户1和3,以及他们各自的喜欢和评论总数。
答案 0 :(得分:2)
你可以使用条件求和来计算,并且由于MySQL处理布尔表达式的方式,sum(case when et.name = 'comment' then 1 else 0 end)
这样的表达式("正常" SQL语法)可以减少到{{1} }。
sum(case when et.name = 'comment')
结果:
SELECT
u.id,
sum(et.name = 'comment') AS comments,
sum(et.name = 'like') AS likes
FROM users AS u
LEFT JOIN engagements AS e ON u.id = e.user_id
JOIN engagement_types AS et ON e.engagement_type_id = et.id
GROUP BY u.id
HAVING sum(et.name = 'comment') >= 5
OR sum(et.name = 'like') >= 5