Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL COUNT of multiple left joins – Optimierung

Sie sollten Ihre Abfrage umgestalten. Sie können dies tun, indem Sie die Art und Weise, wie die Abfrage die Daten erfasst, neu anordnen. Wie?

  • Wenden Sie zuerst die WHERE-Klausel an
  • JOINs zuletzt anwenden

Hier ist Ihre ursprüngliche Abfrage:

SELECT t1.num1,t2.num2,t3.num3 
FROM member m 
LEFT JOIN 
( 
   SELECT member_id,COUNT(*) as num1 
   FROM table1 
   GROUP BY member_id 
) t1 ON t1.member_id = m.member_id 
LEFT JOIN 
( 
   SELECT member_id,COUNT(*) as num2 
   FROM table2 
   GROUP BY member_id 
) t2 ON t2.member_id = m.member_id 
LEFT JOIN 
( 
   SELECT member_id,COUNT(*) as num3 
   FROM table3 
   GROUP BY member_id 
) t3 ON t3.member_id = m.member_id 
WHERE m.member_id = 27 

Hier ist Ihre neue Abfrage

SELECT
   IFNULL(t1.num1,0) num1,
   IFNULL(t1.num2,0) num2,
   IFNULL(t1.num3,0) num3
FROM
(
   SELECT * FROM member m 
   WHERE member_id = 27
) 
LEFT JOIN 
( 
   SELECT member_id,COUNT(*) as num1 
   FROM table1 
   WHERE member_id = 27
   GROUP BY member_id 
) t1 ON t1.member_id = m.member_id 
LEFT JOIN 
( 
   SELECT member_id,COUNT(*) as num2 
   FROM table2 
   WHERE member_id = 27
   GROUP BY member_id 
) t2 ON t2.member_id = m.member_id 
LEFT JOIN 
( 
   SELECT member_id,COUNT(*) as num3 
   FROM table3 
   WHERE member_id = 27
   GROUP BY member_id 
) t3 ON t3.member_id = m.member_id 
;

Übrigens habe ich member m geändert in SELECT * FROM member m WHERE member_id = 27 falls Sie Informationen über Mitglied 27 benötigen. Ich habe auch den IFNULL hinzugefügt Funktion für jedes Ergebnis, um 0 zu erzeugen, falls count NULL ist.

Sie müssen sich absolut vergewissern

  • member_id ist der Primärschlüssel der Member-Tabelle
  • member_id ist in Tabelle1, Tabelle2 und Tabelle3 indiziert

Probieren Sie es aus !!!