sql >> Database >  >> RDS >> Mysql

MySQL AANTAL van meerdere linkse joins - optimalisatie

U moet uw query refactoren. U kunt dit doen door de manier waarop de query de gegevens verzamelt opnieuw te ordenen. Hoe?

  • Pas eerst de WHERE-clausule toe
  • Voeg JOINs als laatste toe

Dit is je oorspronkelijke vraag:

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 is je nieuwe vraag

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 ik heb member m gewijzigd in SELECT * FROM member m WHERE member_id = 27 voor het geval je informatie nodig hebt over lid 27. Ik heb ook de IFNULL . toegevoegd functie toe aan elk resultaat om 0 te produceren in het geval dat de telling NULL is.

Je moet er absoluut zeker van zijn

  • member_id is de primaire sleutel van de ledentabel
  • member_id wordt geïndexeerd in table1, table2 en table3

Probeer het eens !!!



  1. controleer op geldige datum die is aangegeven in varchar2

  2. php exec() - mysqldump maakt een leeg bestand aan

  3. hoe een voorwaardelijke uniciteitsbeperking af te dwingen?

  4. PHP Controleer of string een letter bevat