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

Dołączenie MySQL i COUNT() na wielu stołach

Będziesz musiał użyć DISTINCT , ale musisz też policzyć identyfikatory, a nie klucze obce:

SELECT
    table1.name,
    COUNT(DISTINCT table2.id) AS table2_count,
    COUNT(DISTINCT table3.id) AS table3_count,
    COUNT(DISTINCT table4.id) AS table4_count,
    SUM(table4.size) AS table4_size
FROM table1
LEFT JOIN table2 ON table1.id = table2.table1_id
LEFT JOIN table3 ON table2.id = table3.table2_id
LEFT JOIN table4 ON table3.id = table4.table3_id
WHERE table1.id = 1

Oto skrzypce .

Wyjaśnienie: DISTINCT słowo kluczowe eliminuje wszystkie zduplikowane wartości, czego wynikiem jest lista unikalnych wartości.

Jeśli uruchomisz zapytanie bez COUNT() i SUM() , otrzymujesz:

name  table1_id  table2_id  table3_id  size
test  1          1          1          1024 
test  1          1          1          200 
test  1          (null)     (null)     (null) 
test  1          (null)     (null)     (null) 

Więc jeśli dodasz COUNT() i SUM() , oczywiście otrzymujesz:

name  table1_id  table2_id  table3_id  size
test  4          2          2          1224 

Jednak używając DISTINCT z zapytaniem nie pomoże, ponieważ wyraźnie widać zduplikowane wartości, co spowoduje:

name  table1_id  table2_id  table3_id  size
test  1          1          1          1224 

Teraz, jeśli uruchomisz moje zapytanie bez COUNT() i SUM() , otrzymujesz:

name  table1_id  table2_id  table3_id  size
test  1          1          1          1024 
test  1          1          2          200 
test  2          (null)     (null)     (null) 
test  3          (null)     (null)     (null) 

Jeśli dodasz COUNT() i SUM() , otrzymujesz dokładnie takie same wyniki jak Twoje zapytanie:

name  table1_id  table2_id  table3_id  size
test  4          2          2          1224 

Ponieważ jednak tym razem masz różne wartości (tzn. nie wszystkie są 1), więc teraz, jeśli policzysz unikalne wartości za pomocą DISTINCT , otrzymujesz:

name  table1_id  table2_id  table3_id  size
test  3          1          2          1224 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL LOAD_FILE() ładuje wartości null

  2. SQLSTATE[HY000] [2002] Próba połączenia nie powiodła się.. - Podczas próby połączenia z serwera lokalnego na zdalny

  3. MySQL - numer połączenia osiągnięty

  4. Znajdź zduplikowane ciągi w bazie danych

  5. Mysql - Błąd PDO - Nieprawidłowa nazwa katalogu:1046 Nie wybrano bazy danych