sql >> Database >  >> RDS >> Mysql

MySQL join en COUNT() op meerdere tabellen

U moet DISTINCT . gebruiken , maar je moet ook de ID's tellen, niet de refererende sleutels:

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

Hier is een viool .

Uitleg: De DISTINCT trefwoord elimineert alle dubbele waarden, wat resulteert in een lijst met unieke waarden.

Als u uw zoekopdracht uitvoert zonder de COUNT() en SUM() , krijg je:

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) 

Dus als u de COUNT() . toevoegt en SUM() , krijg je natuurlijk:

name  table1_id  table2_id  table3_id  size
test  4          2          2          1224 

Echter, met behulp van DISTINCT met uw zoekopdracht zal niet helpen omdat u duidelijk de dubbele waarden kunt zien, wat zal resulteren in:

name  table1_id  table2_id  table3_id  size
test  1          1          1          1224 

Als u nu mijn zoekopdracht uitvoert zonder de COUNT() en SUM() , krijg je:

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) 

Als u de COUNT() . toevoegt en SUM() , krijgt u precies dezelfde resultaten als uw zoekopdracht:

name  table1_id  table2_id  table3_id  size
test  4          2          2          1224 

Omdat je deze keer echter verschillende waarden hebt (d.w.z. niet allemaal 1), dus als je nu de unieke waarden telt met DISTINCT , krijg je:

name  table1_id  table2_id  table3_id  size
test  3          1          2          1224 


  1. MySQL – Wacht enkele seconden met SELECT SLEEP()

  2. Emoji's zoeken in MySQL

  3. Kopieer waarden van de ene kolom naar de andere in dezelfde tabel

  4. Hoe cbrt() werkt in PostgreSQL