Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL COUNT de plusieurs jointures à gauche - optimisation

Vous devriez refactoriser votre requête. Pour ce faire, réorganisez la manière dont la requête collecte les données. Comment ?

  • Appliquez d'abord la clause WHERE
  • Appliquer les JOIN en dernier

Voici votre requête d'origine :

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 

Voici votre nouvelle requête

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 
;

BTW j'ai changé member m dans SELECT * FROM member m WHERE member_id = 27 au cas où vous auriez besoin d'informations sur le membre 27. J'ai également ajouté le IFNULL fonction à chaque résultat pour produire 0 si le nombre est NULL.

Vous devez vous assurer absolument

  • member_id est la clé primaire de la table des membres
  • member_id est indexé dans table1, table2 et table3

Essayez-le !!!