Anda perlu menggunakan GROUP BY
untuk menjelaskan pengelompokan apa yang harus dihitung berdasarkan. Tanpa GROUP BY
Anda hanya mendapatkan satu grup dari seluruh rangkaian hasil, seperti yang Anda lihat.
Dalam SQL standar perlu disertakan dalam GROUP BY
klausa setiap ekspresi non-agregat yang disertakan dalam SELECT
klausa, tetapi MySQL memungkinkan Anda lolos dengan tidak melakukan ini, memungkinkan ekspresi seperti berikut. (Setidaknya, ketika tidak dalam mode ketat; Saya tidak yakin apakah mode ketat memperkuat persyaratan ini untuk mencocokkan SQL standar)
SELECT `items`.*, COUNT(1) AS points
FROM `items` INNER JOIN `points` ON `items`.`id` = `points`.`item_id`
WHERE ...
GROUP BY `items`.`id`
Dengan asumsi bahwa items.id
adalah kunci utama tabel ini, sehingga tidak akan muncul di lebih dari satu baris items
, ini akan memiliki efek yang diinginkan.
Setelah Anda memperkenalkan GROUP BY
penting untuk memahami perbedaan antara WHERE
dan HAVING
klausa. Yang pertama menerapkan kondisi sebelum kelompok dan agregat diterapkan, sedangkan yang terakhir berlaku setelahnya . Ini berarti Anda harus menggunakan HAVING
jika Anda ingin melakukan kondisional berdasarkan hitungan itu; WHERE
klausa dalam contoh awal Anda akan diterapkan sebelum agregat, jadi hasilnya adalah jumlah poin yang dibuat setelah tanggal yang ditentukan.