sql >> データベース >  >> RDS >> Mysql

クエリ:アイテムごとに複数の集計をカウントします

    ここにトリックがあります: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 条項。これらの句は、選択リスト内のすべての式が評価された後に実行されます。



    1. メールのPHP添付ファイルが空です

    2. SQLServerの「intをデータ型numericに変換する算術オーバーフローエラー」を修正しました

    3. なぜSQLSTATE[HY000]:一般的なエラーですか?

    4. MySQL GROUP_CONCAT:出力のフォーマット