sylar32:
項目とその状態-私は2つのテーブルを持っています。各項目は、1つの状態のみを持っています。私は、その状態の数え項目ではなく、唯一の特定のowerから状態のリストを取得する必要があります。私は削除するとWHERE
一部を、私はすべての状態のリストを取得するが、所有者との項目で使用されるすべてのと同じ状態ではありませんので、それを私は、州の一部だけを取得しますno.7
。それの量がゼロであっても、すべての状態を取得する方法?
私が持っている唯一の解決策は、代わりに使用サブクエリであるCOUNT(i.id)
が、それははるかに遅くなるだろうと私はパフォーマンスの怖いです。
私のテーブル:
ID STATE NAME
== ==========
1 New
2 Used
3 Archived
4 Unknown
ID STATE ITEM NAME OWNER
== ===== ========= =====
1 1 ABC 7
2 2 DEF 6
3 3 GHI 7
4 1 JKL 7
マイクエリ:
SELECT
s.id,
s.name,
COUNT(i.id) AS count
FROM
b_items_states s
LEFT JOIN
b_items i ON i.state = s.id
WHERE
i.owner = 7
GROUP BY
s.id
私の結果:
ID NAME COUNT
== ==== =====
1 New 2
3 Archived 1
私の期待される結果:
ID NAME COUNT
== ==== =====
1 New 2
2 Used 0
3 Archived 1
4 Unknown 0
串刺し:
のように、JOINの内部フィルタリング条件を移動します:
SELECT
s.id,
s.name,
COUNT(i.id) AS count
FROM
b_items_states s
LEFT JOIN
b_items i ON i.state = s.id AND i.owner = 7
GROUP BY
s.id
あなたがフィルタリング条件を配置する場合WHERE
のステートメントは、暗黙のうち、外側にも気付かず、内部結合に参加変換しています。