ホームページ > データベース > mysql チュートリアル > SQL COUNT 関数が個別の行ではなくすべての行をカウントするのはなぜですか?

SQL COUNT 関数が個別の行ではなくすべての行をカウントするのはなぜですか?

Linda Hamilton
リリース: 2025-01-18 05:32:09
オリジナル
651 人が閲覧しました

Why Is My SQL COUNT Function Counting All Rows Instead of Distinct Rows?

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 関数を適用する前に、結果が AuraStatusCOUNT(*) によって正しくグループ化されるようになりました。これにより、COUNT 関数が AuraIDAuraStatus の異なる組み合わせで動作し、必要な個別の行数が生成されることが保証されます。 修正されたクエリは、意図したとおりに個別の行を正確にカウントします。

以上がSQL COUNT 関数が個別の行ではなくすべての行をカウントするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート