Saya hanya akan menambahkan group_id
ke GROUP BY
.
Ketika SELECT
ing kolom yang bukan bagian dari GROUP BY
mungkin ada beberapa nilai untuk kolom itu di dalam grup, tetapi hanya akan ada ruang untuk satu nilai dalam hasil. Jadi, database biasanya perlu diberitahu dengan tepat bagaimana membuat beberapa nilai tersebut menjadi satu nilai. Biasanya, ini dilakukan dengan fungsi agregat seperti COUNT()
, SUM()
, MAX()
dll... saya katakan biasanya karena sebagian besar sistem basis data populer lainnya bersikeras akan hal ini. Namun, di MySQL sebelum versi 5.7, perilaku defaultnya lebih pemaaf karena tidak akan mengeluh dan kemudian secara sewenang-wenang memilih nilai apa pun ! Ia juga memiliki ANY_VALUE()
fungsi yang dapat digunakan sebagai solusi lain untuk pertanyaan ini jika Anda benar-benar membutuhkan perilaku yang sama seperti sebelumnya. Fleksibilitas ini memerlukan biaya karena non-deterministik, jadi saya tidak akan merekomendasikannya kecuali Anda memiliki alasan yang sangat baik untuk membutuhkannya. MySQL sekarang mengaktifkan only_full_group_by
menyetel secara default untuk alasan yang baik, jadi sebaiknya biasakan dan buat kueri Anda mematuhinya.
Jadi mengapa jawaban sederhana saya di atas? Saya telah membuat beberapa asumsi:
1) group_id
unik. Tampaknya masuk akal, bagaimanapun juga itu adalah 'ID'.
2) group_name
juga unik. Ini mungkin bukan asumsi yang masuk akal. Jika ini bukan masalahnya dan Anda memiliki beberapa group_names
duplikat dan Anda kemudian mengikuti saran saya untuk menambahkan group_id
ke GROUP BY
, Anda mungkin menemukan bahwa Anda sekarang mendapatkan lebih banyak hasil daripada sebelumnya karena grup dengan nama yang sama sekarang akan memiliki baris terpisah di hasil. Bagi saya, ini akan lebih baik daripada menyembunyikan grup duplikat ini karena database diam-diam memilih nilai secara sewenang-wenang!
Ini juga merupakan praktik yang baik untuk memenuhi syarat semua kolom dengan nama tabel atau aliasnya ketika ada lebih dari satu tabel yang terlibat...
SELECT
g.group_id AS 'value',
g.group_name AS 'text'
FROM mod_users_groups g
LEFT JOIN mod_users_data d ON g.group_id = d.group_id
WHERE g.active = 1
AND g.department_id = 1
AND g.manage_work_orders = 1
AND g.group_name != 'root'
AND g.group_name != 'superuser'
GROUP BY
g.group_name,
g.group_id
HAVING COUNT(d.user_id) > 0
ORDER BY g.group_name