sql >> Databáze >  >> RDS >> Mysql

MySQL COUNT z více levých spojení - optimalizace

Měli byste svůj dotaz refaktorovat. Můžete to provést změnou pořadí způsobu, jakým dotaz shromažďuje data. Jak?

  • Nejprve použijte klauzuli WHERE
  • Použít JOIN jako poslední

Zde je váš původní dotaz:

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 

Zde je váš nový dotaz

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 Změnil jsem member m do SELECT * FROM member m WHERE member_id = 27 v případě, že potřebujete nějaké informace o členovi 27. Také jsem přidal IFNULL funkce pro každý výsledek produkovat 0 v případě, že počet je NULL.

Musíte se naprosto ujistit

  • member_id je primární klíč tabulky členů
  • member_id je indexováno v tabulce1, tabulce2 a tabulce3

Vyzkoušejte to !!!



  1. Jak mohu dotazovat hodnotu ve sloupci SQL Server XML

  2. Jak získat včerejší datum v SQLite

  3. Rozdíl mezi set, \set a \pset v psql

  4. Použití Javy k vytvoření zabezpečeného připojení k MySQL Amazon RDS (SSL/TLS)