Bạn sẽ cần sử dụng DISTINCT
, nhưng bạn cũng cần đếm các ID, không phải các khóa ngoại:
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
Đây là fiddle .
Giải thích: DISTINCT
từ khóa loại bỏ tất cả các giá trị trùng lặp dẫn đến một danh sách các giá trị duy nhất.
Nếu bạn chạy truy vấn của mình mà không có COUNT()
và SUM()
, bạn nhận được:
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)
Vì vậy, nếu bạn thêm COUNT()
và SUM()
, bạn rõ ràng nhận được:
name table1_id table2_id table3_id size test 4 2 2 1224
Tuy nhiên, sử dụng DISTINCT
với truy vấn của bạn sẽ không hữu ích vì bạn có thể thấy rõ các giá trị trùng lặp, điều này sẽ dẫn đến:
name table1_id table2_id table3_id size test 1 1 1 1224
Bây giờ, nếu bạn chạy truy vấn của tôi mà không có COUNT()
và SUM()
, bạn nhận được:
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)
Nếu bạn thêm COUNT()
và SUM()
, bạn sẽ nhận được kết quả chính xác giống như truy vấn của bạn:
name table1_id table2_id table3_id size test 4 2 2 1224
Tuy nhiên, vì lần này bạn có các giá trị khác nhau (tức là không phải tất cả đều là 1), nên bây giờ nếu bạn đếm các giá trị duy nhất bằng cách sử dụng DISTINCT
, bạn nhận được:
name table1_id table2_id table3_id size test 3 1 2 1224