sql >> Database teknologi >  >> RDS >> Mysql

MySQL join og COUNT() på flere tabeller

Du skal bruge DISTINCT , men du skal også tælle ID'erne, ikke fremmednøglerne:

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

Her er en violin .

Forklaring: DISTINCT nøgleord eliminerer alle duplikerede værdier, hvilket resulterer i en liste over unikke værdier.

Hvis du kører din forespørgsel uden COUNT() og SUM() , får du:

navn tabel1_id tabel2_id tabel3_id størrelsestest 1 1 1 1024 test 1 1 1 200 test 1 (nul) (nul) (nul) test 1 (nul) (nul) (nul) 

Så hvis du tilføjer COUNT() og SUM() , du får åbenbart:

navn tabel1_id tabel2_id tabel3_id størrelsestest 4 2 2 1224 

Men ved at bruge DISTINCT med din forespørgsel hjælper det ikke, fordi du tydeligt kan se de duplikerede værdier, hvilket vil resultere i:

navn tabel1_id tabel2_id tabel3_id størrelsestest 1 1 1 1224 

Nu, hvis du kører min forespørgsel uden COUNT() og SUM() , får du:

navn tabel1_id tabel2_id tabel3_id størrelsestest 1 1 1 1024 test 1 1 2 200 test 2 (nul) (nul) (nul) test 3 (nul) (nul) (nul) 

Hvis du tilføjer COUNT() og SUM() , får du nøjagtig de samme resultater som din forespørgsel:

navn tabel1_id tabel2_id tabel3_id størrelsestest 4 2 2 1224 

Men fordi du denne gang har forskellige værdier (dvs. ikke alle er 1), så nu hvis du tæller de unikke værdier ved hjælp af DISTINCT , får du:

navn tabel1_id tabel2_id tabel3_id størrelsestest 3 1 2 1224 


  1. Udtræk tal fra en tekst i SQL Server

  2. Opret en dynamisk mysql-forespørgsel ved hjælp af php-variabler

  3. Partitionsfunktion COUNT() OVER mulig ved brug af DISTINCT

  4. php mysql dobbelt datointerval