2017-07-08 7 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節に移動することで、あなたが望む効果を得ることができると述べています。 WHERE um.status = 'sent' or um.message_id IS NULLmessage_idはNOT NULLと宣言されていると仮定します)またはLEFT JOIN (SELECT * FROM user_messages WHERE status = 'sent') AS umをFROM句に含めることもできます。

関連する問題