ここにトリックがあります:SUM()
を計算する 1または0であることがわかっている値の数は、COUNT()
と同等です。 値が1である行の数。ブール比較では1または0(またはNULL)が返されることがわかります。
SELECT c.catname, COUNT(m.catid) AS item_count,
SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
LEFT JOIN map m USING (catid)
LEFT JOIN items i USING (itemid)
GROUP BY c.catid;
ボーナスの質問については、外部結合の代わりに内部結合を行うことができます。これは、map
に少なくとも1つの行があるカテゴリのみを意味します。 返されます。
SELECT c.catname, COUNT(m.catid) AS item_count,
SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
INNER JOIN map m USING (catid)
INNER JOIN items i USING (itemid)
GROUP BY c.catid;
別の解決策がありますが、これはそれほど効率的ではありませんが、エラーが発生した理由を説明するために示します。
SELECT c.catname, COUNT(m.catid) AS item_count,
SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
LEFT JOIN map m USING (catid)
LEFT JOIN items i USING (itemid)
GROUP BY c.catid
HAVING item_count > 0;
WHERE
で列エイリアスを使用することはできません WHERE
の式が 句は、選択リストの式の前に評価されます。つまり、選択リスト式に関連付けられた値はまだ使用できません。
GROUP BY
で列エイリアスを使用できます 、HAVING
、およびORDER BY
条項。これらの句は、選択リスト内のすべての式が評価された後に実行されます。