2017-07-08 23 views
-1

假設沒有語法錯誤,並且列名和表名是正確的,下面的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 
; 
+0

您收到的錯誤是什麼?你的問題是什麼 –

+0

運行EXPLAIN EXTENDED,然後是SHOW WARNINGS;我會讓你決定這個結果是否符合你對'錯誤'的定義 – Strawberry

回答

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