Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Kesalahan terkait dengan only_full_group_by saat menjalankan kueri di MySql

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Beberapa kueri dieksekusi di java dalam satu pernyataan

  2. SQL SELECT untuk mendapatkan N bilangan bulat positif pertama

  3. Menghasilkan pohon berbasis Kedalaman dari Data Hirarki di MySQL (tanpa CTE)

  4. Apa itu MySQL Workbench?

  5. Bagaimana cara mendapatkan jumlah hari perbedaan antara dua tanggal di MySQL?