U moet uw query refactoren. U kunt dit doen door de manier waarop de query de gegevens verzamelt opnieuw te ordenen. Hoe?
- Pas eerst de WHERE-clausule toe
- Voeg JOINs als laatste toe
Dit is je oorspronkelijke vraag:
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
Hier is je nieuwe vraag
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 ik heb member m
gewijzigd in SELECT * FROM member m WHERE member_id = 27
voor het geval je informatie nodig hebt over lid 27. Ik heb ook de IFNULL
. toegevoegd functie toe aan elk resultaat om 0 te produceren in het geval dat de telling NULL is.
Je moet er absoluut zeker van zijn
- member_id is de primaire sleutel van de ledentabel
- member_id wordt geïndexeerd in table1, table2 en table3
Probeer het eens !!!