Rumah > pangkalan data > tutorial mysql > Mengapa Fungsi SQL COUNT Saya Mengira Semua Baris Daripada Baris Berbeza?

Mengapa Fungsi SQL COUNT Saya Mengira Semua Baris Daripada Baris Berbeza?

Linda Hamilton
Lepaskan: 2025-01-18 05:32:09
asal
651 orang telah melayarinya

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

Menyelesaikan masalah SQL COUNT: Mengapa Ia Mengira Semua Baris Daripada Yang Terbeza

Artikel ini menangani isu SQL biasa: fungsi COUNT mengembalikan jumlah kiraan baris dan bukannya kiraan yang berbeza. Kami akan menganalisis pernyataan SQL yang bermasalah dan menunjukkan cara membetulkannya.

Pertanyaan SQL berikut bertujuan untuk mengira baris individu, tetapi ia tersalah mengira semua baris:

<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>
Salin selepas log masuk

Masalahnya terletak pada LEFT JOIN subquery. Ia tiada klausa GROUP BY yang penting. Fungsi COUNT(*), tanpa GROUP BY, mengagregat merentasi semua baris dalam messages_aura.

Untuk membetulkannya, kita perlu menambah klausa GROUP BY pada subkueri 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>
Salin selepas log masuk

LEFT JOIN yang disemak ini kini mengumpulkan hasil dengan betul mengikut AuraID dan AuraStatus sebelum menggunakan fungsi COUNT(*). Ini memastikan fungsi COUNT beroperasi pada kombinasi AuraID dan AuraStatus yang berbeza, menghasilkan kiraan baris individu yang dikehendaki. Pertanyaan yang diperbetulkan kemudiannya akan mengira baris yang berbeza dengan tepat seperti yang dimaksudkan.

Atas ialah kandungan terperinci Mengapa Fungsi SQL COUNT Saya Mengira Semua Baris Daripada Baris Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan