クエリをリファクタリングする必要があります。これを行うには、クエリがデータを収集する方法を並べ替えます。どうやって?
- 最初にWHERE句を適用します
- 最後にJOINを適用する
元のクエリは次のとおりです:
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
を変更しました into SELECT * FROM member m WHERE member_id = 27
メンバー27に関する情報が必要な場合に備えて、IFNULL
も追加しました。 countがNULLの場合、各結果に対して関数を実行して0を生成します。
絶対に確認する必要があります
- member_idはメンバーテーブルの主キーです
- member_idは、table1、table2、およびtable3でインデックス付けされます
試してみてください!!!