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>
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>
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!