2017-10-02 4 views
0

Mein Schema verbunden Zählen, Abfrage- und problematische Ergebnisse hier zu sehen ist: http://sqlfiddle.com/#!17/55bc3/5/0Ausgabe Zeilen aus zwei Tabellen

ich ein Schema zum Speichern von Posts, Kommentare und Favoriten erstellt haben. (Ich habe mein Beispiel zur Demonstration vereinfacht). Ich versuche, eine Abfrage zu erstellen, um die Like/Favorite-Zählungen für jeden Beitrag zu aggregieren, um auf einer "Titelseite" angezeigt zu werden.

Um die Beziehungen zwischen Benutzern/Posts/Favoriten zu modellieren, habe ich mehrere Schnitttabellen verwendet. In der Abfrage verwende ich zwei LEFT JOIN s, und dann COUNT in verschiedenen Spalten in den Ergebnissen. Ich habe ein Problem festgestellt, bei dem die COUNT, die ich als comment_count speichere, favourite_count überschreibt, wenn sie etwas über 0 zurückgibt, wodurch doppelte Werte für beide Spalten zurückgegeben werden.

ich denken ich den Mechanismus dahinter verstehen, ist, dass die GROUP ing der Ergebnisse die resultierenden Reihen verursacht zusammen zerquetscht zu erhalten ein falsches Ergebnis zu erhalten. Ich habe mich gefragt, ob irgendjemand mir etwas über die Theorie dahinter sagen könnte, wie das heißt, und wie Sie richtig schreiben würden, um mit diesem Szenario umzugehen.

Antwort

1

Da es sich um nicht verwandte Tabellen handelt, können Sie einzeln zählen und dann beitreten.

SELECT p.id 
,coalesce(c.comment_count,0) as comment_count 
,coalesce(f.favorite_count,0) as favorite_count 
FROM post p 
LEFT JOIN (select post_id,count(*) as comment_count 
      from comment group by post_id) c ON c.post_id=p.id 
LEFT JOIN (select post_id,count(*) as favorite_count 
      from favourite group by post_id) f ON f.post_id=p.id 
+0

Vielen Dank für Ihre Lösung! Ich habe in diesem Beispiel Unterabfragen vermieden, weil ich davor gewarnt wurde, dass sie sich negativ auf die Leistung auswirken, aber dies scheint ziemlich gut zu sein. Ich denke, ich werde einfach mit Ihrer Lösung gehen. Danke für Ihre Antwort! Ich denke, ich sollte nicht vorzeitig optimieren! – ajxs

Verwandte Themen