Вы должны рефакторинг вашего запроса. Вы можете сделать это, изменив порядок сбора данных в запросе. Как?
- Сначала примените предложение WHERE
- Применить СОЕДИНЕНИЯ в последний раз
Вот ваш оригинальный запрос:
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
Вот вам новый запрос
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
;
Кстати, я изменил member m
на SELECT * FROM member m WHERE member_id = 27
на случай, если вам понадобится какая-либо информация об элементе 27. Я также добавил функцию IFNULL
к каждому результату, чтобы получить 0, если счетчик равен NULL.
Вы должны быть абсолютно уверены,
- member_id является первичным ключом таблицы элементов
- member_id индексируется в таблицах table1, table2 и table3
Попробуй !!!