Ini adalah kesalahan umum untuk pengguna MySQL. Di MySQL 5.7, secara default database menerapkan semantik standar yang telah diterapkan oleh sebagian besar database SQL lainnya selama bertahun-tahun.
Aturannya adalah setiap kolom dalam daftar pilihan Anda harus salah satu dari:
- Dinamakan dalam klausa GROUP BY; yaitu apa yang Anda kelompokkan.
- Di dalam fungsi agregat seperti MIN, MAX(), SUM(), GROUP_CONCAT(), dll.
- Secara fungsional bergantung pada kolom tempat Anda mengelompokkan (ini adalah ekstensi MySQL untuk perilaku SQL standar, dan database SQL lainnya belum tentu mendukung ini).
Dalam kueri Anda (saya akan memperluas SELECT *
. Anda ):
select user_id, feature_key, feature_value from user_features
where user_id = 1
group by feature_key
Anda mengelompokkan berdasarkan feature_key, tetapi ini berarti kolom lain tidak mematuhi aturan yang saya jelaskan di atas.
Berikut cara memperbaikinya:
select MAX(user_id), feature_key, GROUP_CONCAT(feature_value)
from user_features
where user_id = 1
group by feature_key
Tampaknya berlebihan menggunakan MAX(user_id)
karena hanya ada satu nilai yang mungkin berdasarkan kondisi klausa WHERE. Tapi tidak ada salahnya juga. MIN(user_id)
juga akan bekerja.
Lihat juga jawaban saya sebelumnya pada kesalahan yang sama ini: