选择左边多个计数加入同一个表

时间:2015-02-11 07:46:07

标签: mysql

我不确定是否可以这样做,我有一个用户表,其中有一个用户活动的相关表连接在一个外键上。活动有不同的类型,例如评论等等。我需要按照每种不同活动类型的数量来过滤用户。

到目前为止我所拥有的是:

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:6评论,8喜欢
  • 用户2:3条评论,2条喜欢
  • 用户3:5条评论,2条喜欢

我希望查询只返回用户1和3,以及他们各自的喜欢和评论总数。

http://sqlfiddle.com/#!2/dcc63/4

1 个答案:

答案 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

Sample SQL Fiddle