2017-07-08 4 views
-1

Angenommen, es gibt keinen Syntaxfehler und die Spaltennamen und Tabellennamen sind korrekt, was ist falsch mit der MySQL-Abfrage unten?Willst du die Probleme finden

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

Welchen Fehler erhalten Sie? Was ist Ihre Frage genau –

+0

Führen Sie EXPLAIN EXTENDED gefolgt von SHOW WARNINGS; Ich überlasse es Ihnen zu entscheiden, ob dieses Ergebnis Ihrer Definition von "falsch" entspricht – Strawberry

Antwort

0

Vermutlich Sie Benutzer ohne gesendeten Nachrichten und Nachrichtenanzahl von 0 bis erwarten (für jeden Benutzer die wir haben, ist dies die Anzahl der Nachrichten, die sie geschickt zurückkehren soll), aber Sie sind sie nicht sehen? Dies liegt daran, dass Sie einschließen und diese Datensätze aus der Ergebnismenge eliminiert werden, bevor die Aggregation ausgeführt wird.

Es gibt eine Reihe von Lösungen für das Problem. Angenommen, Klaus sagt im folgenden Kommentar, dass Sie den gewünschten Effekt erhalten, indem Sie die Bedingung in die JOIN-Klausel verschieben. Sie können auch WHERE um.status = 'sent' or um.message_id IS NULL (vorausgesetzt, message_id wird NICHT NULL deklariert) oder LEFT JOIN (SELECT * FROM user_messages WHERE status = 'sent') AS um in der FROM-Klausel.

Verwandte Themen