Bạn nên cấu trúc lại truy vấn của mình. Bạn có thể làm điều này bằng cách sắp xếp lại cách truy vấn thu thập dữ liệu. Làm thế nào?
- Áp dụng mệnh đề WHERE trước tiên
- Áp dụng THAM GIA lần cuối
Đây là truy vấn ban đầu của bạn:
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
Đây là truy vấn mới của bạn
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 Tôi đã thay đổi member m
thành SELECT * FROM member m WHERE member_id = 27
trong trường hợp bạn cần bất kỳ thông tin nào về thành viên 27. Tôi cũng đã thêm IFNULL
hàm cho mỗi kết quả để tạo ra 0 trong trường hợp số lượng là NULL.
Bạn cần hoàn toàn chắc chắn
- member_id là khóa chính của bảng thành viên
- member_id được lập chỉ mục trong table1, table2 và table3
Hãy thử !!!