想要找到问题

时间:2017-07-08 16:20:57

标签: mysql

假设没有语法错误,列名和表名都正确,下面的MySQL查询有什么问题?

(对于我们每个用户,这应该返回他们发送的消息数量)

select
u.user_id
, sum(case when um.message_id is not null then 1 else 0 end) as number_of_messages_sent
from users u
left join users_messages um
  on um.user_id = u.user_id
where um.status = 'sent'
group by
u.user_id
;

1 个答案:

答案 0 :(得分:0)

据推测,您希望看到没有发送消息且消息计数为0的用户,但您没有看到它们?这是因为您包含WHERE um.status = 'sent',这将在执行聚合之前从结果集中删除这些记录。

这个问题有很多解决方案。假设Klaus在下面的评论中指出,通过将条件移动到JOIN子句中,您将获得所需的效果。您也可以在FROM子句中执行WHERE um.status = 'sent' or um.message_id IS NULL(假设message_id被声明为NOT NULL)或LEFT JOIN (SELECT * FROM user_messages WHERE status = 'sent') AS um