Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL COUNT wielu lewych złączeń - optymalizacja

Powinieneś dokonać refaktoryzacji zapytania. Możesz to zrobić, zmieniając kolejność sposobu, w jaki zapytanie zbiera dane. Jak?

  • Najpierw zastosuj klauzulę WHERE
  • Zastosuj JOIN jako ostatnie

Oto Twoje oryginalne zapytanie:

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 

Oto nowe zapytanie

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 zmieniłem member m w SELECT * FROM member m WHERE member_id = 27 jeśli potrzebujesz informacji o użytkowniku 27. Dodałem również IFNULL funkcji do każdego wyniku, aby wytworzyć 0 w przypadku, gdy liczba jest NULL.

Musisz mieć absolutną pewność

  • member_id to klucz podstawowy tabeli członków
  • member_id jest indeksowany w tabela1, tabela2 i tabela3

Wypróbuj !!!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. wstępnie wybrane wartości dla dynamicznego menu rozwijanego z wieloma wartościami

  2. pasujące nazwy tabel z tabelami pokazowymi

  3. last_insert_id() a SELECT Max (ID)

  4. Jak przekonwertować tablicę MySQL JSON na ciąg oddzielony przecinkami?

  5. Pobieranie rekordów mysql do tabeli html przy użyciu PHP