Pertanyaan SQL mengembalikan jumlah bilangan baris dan bukannya kiraan baris individu
Apabila melaksanakan pertanyaan SQL, pastikan anda menggunakan fungsi agregat seperti COUNT(*) dengan betul untuk mengelakkan hasil yang salah. Pertimbangkan pernyataan berikut:
<code class="language-sql">SELECT `ID`, `To`, `Poster`, `Content`, `Time`, ifnull(`Aura`, 0) AS `Aura` 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) GROUP BY `ID`, `Poster` ORDER BY `Time` DESC LIMIT 10;</code>
Matlamat pertanyaan ini adalah untuk menanyakan data daripada jadual messages
dan messages_aura
dan mengira bilangan kemunculan mesej aura untuk setiap pengguna. Walau bagaimanapun, masalahnya ialah dalam subkueri LEFT JOIN
, di mana klausa GROUP BY
tiada.
Masalah: Tanpa klausa GROUP BY
, subkueri akan mengembalikan jumlah bilangan mesej aura untuk semua pengguna dan bukannya mengira nombor untuk setiap pengguna. Akibatnya, output menunjukkan kiraan yang salah kerana ia mengagregatkan semua baris dan bukannya mengumpulkan mengikut lajur yang berkaitan.
Penyelesaian: Untuk menyelesaikan masalah ini, klausa GROUP BY
mesti ditambah 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>
Dengan menambahkan GROUP BY AuraID, AuraStatus
, subkueri kini mengumpulkan hasil mengikut lajur ini, memastikan kiraan aura untuk setiap pengguna adalah tepat.
Atas ialah kandungan terperinci Mengapa SQL COUNT(*) Saya Mengembalikan Jumlah Daripada Kiraan Baris Individu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!