Du bör refaktorera din fråga. Du kan göra detta genom att ändra ordningen på hur frågan samlar in data. Hur?
- Använd WHERE-satsen först
- Använd JOINs senast
Här är din ursprungliga fråga:
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
Här är din nya fråga
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 jag ändrade member m
till SELECT * FROM member m WHERE member_id = 27
om du behöver någon information om medlem 27. Jag har också lagt till IFNULL
funktion för varje resultat för att producera 0 om antalet är NULL.
Du måste vara helt säker
- member_id är den primära nyckeln för medlemstabellen
- medlems-id indexeras i tabell1, tabell2 och tabell3
Ge det ett försök!!!