sql >> Databasteknik >  >> RDS >> Mysql

MySQL ANTAL av flera vänsteranslutningar - optimering

Du bör refaktorera din fråga. Du kan göra detta genom att ändra ordningen på hur frågan samlar in data. Hur?

  • Använd WHERE-satsen först
  • Använd JOINs senast

Här är din ursprungliga fråga:

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 

Här är din nya fråga

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 jag ändrade member m till SELECT * FROM member m WHERE member_id = 27 om du behöver någon information om medlem 27. Jag har också lagt till IFNULL funktion för varje resultat för att producera 0 om antalet är NULL.

Du måste vara helt säker

  • member_id är den primära nyckeln för medlemstabellen
  • medlems-id indexeras i tabell1, tabell2 och tabell3

Ge det ett försök!!!



  1. Hur man startar psql.exe

  2. LocalDateTime , ZonedDateTime och Timestamp

  3. Oracle varchar2 till nvarchar2 konvertering

  4. Hitta unika användare från länkade värden