ホームページ >データベース >mysql チュートリアル >SQL COUNT 関数が個別の行ではなくすべての行をカウントするのはなぜですか?
SQL COUNT のトラブルシューティング: 個別の行ではなくすべての行がカウントされる理由
この記事では、一般的な SQL の問題、つまり個別の行数ではなく合計行数を返す COUNT
関数について説明します。問題のある SQL ステートメントを分析し、それを修正する方法を示します。
次の SQL クエリは個々の行をカウントすることを目的としていますが、誤ってすべての行をカウントしています:
<code class="language-sql">SELECT `ID`, `To`, `Poster`, `Content`, `Time`, ifnull(`Aura`, 0) AS `Aura` FROM ( SELECT * FROM ( SELECT DISTINCT * FROM messages m INNER JOIN ( SELECT Friend2 AS Friend FROM friends WHERE Friend1 = '1' UNION ALL SELECT Friend1 AS Friend FROM friends WHERE Friend2 = '1' ) friends ON m.Poster = friends.`Friend` UNION ALL SELECT DISTINCT *, '1' FROM messages WHERE `Poster` = '1' ) var LEFT JOIN ( SELECT `ID` AS `AuraID`, `Status` AS `AuraStatus`, COUNT(*) AS `Aura` FROM messages_aura ) aura ON (var.Poster = aura.AuraID AND var.ID = aura.AuraStatus) ) final GROUP BY `ID`, `Poster` ORDER BY `Time` DESC LIMIT 10;</code>
問題は LEFT JOIN
サブクエリにあります。 重要な GROUP BY
句が欠落しています。 COUNT(*)
関数は、GROUP BY
なしで、messages_aura
内のすべての行を集計します。
これを修正するには、GROUP BY
句を LEFT JOIN
サブクエリに追加する必要があります。
<code class="language-sql">LEFT JOIN ( SELECT `ID` AS `AuraID`, `Status` AS `AuraStatus`, COUNT(*) AS `Aura` FROM messages_aura GROUP BY AuraID, AuraStatus ) aura ON (var.Poster = aura.AuraID AND var.ID = aura.AuraStatus)</code>
この改訂された LEFT JOIN
では、AuraID
関数を適用する前に、結果が AuraStatus
と COUNT(*)
によって正しくグループ化されるようになりました。これにより、COUNT
関数が AuraID
と AuraStatus
の異なる組み合わせで動作し、必要な個別の行数が生成されることが保証されます。 修正されたクエリは、意図したとおりに個別の行を正確にカウントします。
以上がSQL COUNT 関数が個別の行ではなくすべての行をカウントするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。