Saya telah memutakhirkan sistem saya dan telah menginstal MySql 5.7.9 dengan php untuk aplikasi web yang sedang saya kerjakan. Saya memiliki permintaan yang dibuat secara dinamis, dan ketika dijalankan di versi MySql yang lama, ia berfungsi dengan baik. Sejak meningkatkan ke 5.7 saya mendapatkan kesalahan ini:
Ekspresi # 1 dari daftar SELECT tidak dalam klausa GROUP BY dan berisi kolom 'support_desk.mod_users_groups.group_id yang tidak diagregasi' yang tidak secara fungsional bergantung pada kolom dalam klausa GROUP BY; ini tidak kompatibel dengan sql_mode = only_full_group_by
Perhatikan halaman Manual untuk Mysql 5.7 tentang topik Mode SQL Server .
Ini adalah pertanyaan yang membuat saya kesulitan:
SELECT mod_users_groups.group_id AS 'value',
group_name AS 'text'
FROM mod_users_groups
LEFT JOIN mod_users_data ON mod_users_groups.group_id = mod_users_data.group_id
WHERE mod_users_groups.active = 1
AND mod_users_groups.department_id = 1
AND mod_users_groups.manage_work_orders = 1
AND group_name != 'root'
AND group_name != 'superuser'
GROUP BY group_name
HAVING COUNT(`user_id`) > 0
ORDER BY group_name
Saya melakukan beberapa googling tentang masalah ini, tetapi saya tidak only_full_group_by
cukup mengerti untuk mencari tahu apa yang harus saya lakukan untuk memperbaiki kueri. Bisakah saya mematikan only_full_group_by
opsi, atau ada hal lain yang perlu saya lakukan?
Beri tahu saya jika Anda membutuhkan informasi lebih lanjut.
sumber
not a GROUP BY expression
" Itu dia. Mereka mungkin juga hanya memiliki kode kesalahan numerik dan tidak ada pesan sama sekali.Jawaban:
Saya hanya akan menambahkan
group_id
keGROUP BY
.Saat
SELECT
memasukkan kolom yang bukan bagian dari itu,GROUP BY
mungkin ada beberapa nilai untuk kolom itu di dalam grup, tetapi hanya akan ada ruang untuk nilai tunggal dalam hasil. Jadi, basis data biasanya perlu diberi tahu dengan tepat bagaimana membuat beberapa nilai menjadi satu nilai. Umumnya, hal ini dilakukan dengan fungsi agregat sepertiCOUNT()
,SUM()
,MAX()
dll ... Saya katakan biasanya karena sebagian besar sistem database populer lainnya bersikeras ini. Namun, di MySQL sebelum versi 5.7 perilaku default lebih memaafkan karena tidak akan mengeluh dan kemudian secara acak memilih nilai apa pun ! Ini juga memilikiANY_VALUE()
fungsi yang dapat digunakan sebagai solusi lain untuk pertanyaan ini jika Anda benar-benar membutuhkan perilaku yang sama seperti sebelumnya. Fleksibilitas ini dikenakan biaya karena tidak menentukan, jadi saya tidak akan merekomendasikan itu kecuali Anda memiliki alasan yang sangat baik untuk membutuhkannya. MySQL sekarang mengaktifkanonly_full_group_by
pengaturan secara default untuk alasan yang baik, jadi yang terbaik adalah membiasakan diri dan membuat permintaan Anda mematuhinya.Jadi mengapa jawaban sederhana saya di atas? Saya telah membuat beberapa asumsi:
1)
group_id
unik. Sepertinya masuk akal, itu adalah 'ID' setelah semua.2)
group_name
itu juga unik. Ini mungkin bukan asumsi yang masuk akal. Jika ini bukan masalahnya dan Anda memiliki duplikatgroup_names
dan kemudian mengikuti saran saya untuk ditambahkangroup_id
keGROUP BY
, Anda mungkin menemukan bahwa Anda sekarang mendapatkan hasil lebih banyak dari sebelumnya karena grup dengan nama yang sama sekarang akan memiliki baris terpisah dalam hasil. Bagi saya, ini akan lebih baik daripada menyembunyikan grup duplikat ini karena database diam-diam memilih nilai secara sewenang-wenang!Ini juga praktik yang baik untuk memenuhi syarat semua kolom dengan nama tabel atau alias mereka ketika ada lebih dari satu tabel yang terlibat ...
sumber
GROUP BY
klausa dalam permintaan saya, namun saya mendapatkan kesalahan ini.Anda dapat mencoba menonaktifkan
only_full_group_by
pengaturan dengan menjalankan yang berikut:MySQL 8 tidak menerima
NO_AUTO_CREATE_USER
sehingga perlu dihapus.sumber
SELECT COUNT(*), t.* FROM my_table t GROUP BY col
dan Anda memiliki 20-50 kolom, apakah Anda ingin menghabiskan banyak waktu menambahkan setiap kolom ke dikelompokkan berdasarkan?SELECT @@sql_mode;
dan kemudian menambahkan hasilnya dari sana ke my.cnf:sql_mode=[list of modes from query, minus ONLY_FULL_GROUP_BY]
Anda dapat mematikan pesan peringatan seperti yang dijelaskan dalam jawaban lain atau Anda dapat memahami apa yang terjadi dan memperbaikinya.
Pada MySQL 5.7.5, mode SQL default termasuk ONLY_FULL_GROUP_BY yang berarti ketika Anda mengelompokkan baris dan kemudian memilih sesuatu dari grup itu, Anda perlu secara eksplisit mengatakan dari baris mana seharusnya pemilihan itu dibuat.
Mysql perlu tahu baris mana dalam grup yang Anda cari, yang memberi Anda dua opsi
group by rect.color, rect.value
yang dapat menjadi apa yang Anda inginkan dalam beberapa kasus, jika tidak, akan mengembalikan hasil duplikat dengan warna yang sama yang mungkin tidak Anda inginkanAVG()
MIN()
MAX()
daftar lengkapANY_VALUE()
jika Anda yakin bahwa semua hasil di dalam grup adalah sama. doktersumber
FIRST()
metode / fungsi?ONLY_FULL_GROUP_BY
secara defaultJika Anda tidak ingin melakukan perubahan pada permintaan Anda saat ini, maka ikuti langkah-langkah di bawah ini -
sudo vim /etc/mysql/my.cnf
A
untuk masuk ke mode memasukkanSalin dan tempel
Ketik
esc
untuk keluar dari mode input:wq
untuk menyimpan dan menutup vim.sudo service mysql restart
untuk me-restart MySQL.sumber
paginate
fungsinya.my.cnf
file itu/etc
. Als mencatat sintaks baru sejakMySQL 5.7.8:
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Gunakan
ANY_VALUE()
untuk merujuk ke kolom yang tidak teragregasi.Dari MySQL 5.7 dokumen :
sumber
ANY_VALUE
disebutkan di tempat lain dalam diskusi serupa - bekerja sempurna untuk saya denganGROUP_BY
contains nonaggregated column
kesalahan saya .Saya akan mencoba menjelaskan kepada Anda apa kesalahan ini.
Mulai dari MySQL 5.7.5, opsi
ONLY_FULL_GROUP_BY
diaktifkan secara default.Jadi, menurut standart SQL92 dan sebelumnya:
( baca lebih lanjut dalam dokumen )
Jadi, misalnya:
Anda akan mendapatkan pesan kesalahan setelah menjalankan kueri di atas.
Mengapa?
Karena MySQL tidak benar-benar mengerti, apa nilai tertentu dari catatan yang dikelompokkan untuk diambil, dan inilah intinya.
IE katakanlah Anda memiliki catatan ini di
users
tabel Anda :Dan Anda akan menjalankan showen kueri yang tidak valid di atas.
Dan Anda akan mendapatkan kesalahan yang ditunjukkan di atas, karena, ada 3 catatan dengan nama
John
, dan itu bagus, tetapi, semuanya memilikiemail
nilai bidang yang berbeda .Jadi, MySQL tidak mengerti yang mana dari mereka yang akan dikembalikan dalam catatan yang dikelompokkan.
Anda dapat memperbaiki masalah ini, hanya dengan mengubah kueri Anda seperti ini:
Selain itu, Anda mungkin ingin menambahkan lebih banyak bidang ke bagian SELECT, tetapi Anda tidak dapat melakukannya, jika tidak digabungkan, tetapi ada kruk yang dapat Anda gunakan (tetapi sangat tidak disarankan):
Sekarang, Anda mungkin bertanya, mengapa menggunakan
ANY_VALUE
sangat tidak dianjurkan?Karena MySQL tidak tahu persis nilai rekaman yang dikelompokkan untuk diambil, dan dengan menggunakan fungsi ini, Anda memintanya untuk mengambil salah satu dari mereka (dalam hal ini, email catatan pertama dengan nama = John diambil).
Persis saya tidak dapat menemukan ide mengapa Anda ingin perilaku ini ada.
Tolong, jika Anda tidak mengerti saya, baca lebih lanjut tentang cara kerja pengelompokan di MySQL, itu sangat sederhana.
Dan pada akhirnya, inilah satu lagi permintaan sederhana, namun valid.
Jika Anda ingin kueri total pengguna menghitung menurut umur yang tersedia, Anda mungkin ingin menuliskan kueri ini
Yang sepenuhnya valid, sesuai dengan aturan MySQL.
Dan seterusnya.
Penting untuk memahami apa sebenarnya masalahnya dan baru kemudian menuliskan solusinya.
sumber
GROUP BY DAY(created_date)
? Sepertinya tidak berfungsi jikaDAY()
ditambahkan.Saya menggunakan Laravel 5.3, mysql 5.7.12, di laravel homestead (0.5.0, saya percaya)
Bahkan setelah secara eksplisit mengatur pengeditan
/etc/mysql/my.cnf
untuk mencerminkan:Saya masih menerima kesalahan.
Saya harus berubah
config/database.php
daritrue
menjadifalse
:Bacaan lebih lanjut:
https://laracasts.com/discuss/channels/servers/set-set-sql-mode-on-homestead https://mattstauffer.co/blog/strict-mode-and-other-mysql-customizations-in-laravel -5-2
sumber
Jika Anda menggunakan wamp 3.0.6 atau versi atas selain 2.5 yang stabil, Anda mungkin menghadapi masalah ini, pertama masalahnya adalah dengan sql. Anda harus memberi nama bidang yang sesuai. tetapi ada cara lain yang dapat Anda gunakan untuk menyelesaikannya. klik pada ikon hijau wamp. mysql-> pengaturan mysql-> sql_mode-> tidak ada. atau dari konsol Anda dapat mengubah nilai default.
sumber
show variables like '%sql_mode%';
di baris perintah mysql, pengaturan sql_mode akan mengeksposPenambahan baris (sebutkan di bawah) dalam file: /etc/mysql/my.cnf
Bekerja dengan baik untukku. Versi server: 5.7.18-0ubuntu0.16.04.1 - (Ubuntu)
sumber
Pergi ke mysql atau phpmyadmin dan pilih database kemudian jalankan query ini dan itu akan berfungsi. Ini bekerja dengan baik untuk saya.
sumber
Untuk Mac:
1. Salin default my-default.cnf ke /etc/my.cnf
2. Ubah sql_mode di my.cnf menggunakan editor favorit Anda dan atur ini
3. Mulai ulang server MySQL.
sumber
Inilah yang membantu saya untuk memahami keseluruhan masalah:
Dan dalam contoh berikut lain dari query yang bermasalah.
Bermasalah:
Dipecahkan dengan menambahkan ini ke akhir:
Catatan: Lihat pesan kesalahan dalam PHP, ia memberi tahu Anda di mana masalahnya.
Contoh:
Dalam kasus ini, ekspresi # 4 tidak ada dalam GROUP BY.
sumber
Untuk localhost / wampserver 3 kita dapat mengatur sql-mode = user_mode untuk menghapus kesalahan ini:
kemudian restart wamp atau apache
sumber
Anda dapat menambahkan
unique index
kegroup_id
; jika Anda yakin itugroup_id
unik.Itu dapat menyelesaikan kasus Anda tanpa mengubah kueri .
Jawaban yang terlambat, tetapi belum disebutkan dalam jawaban. Mungkin itu harus menyelesaikan jawaban yang sudah komprehensif yang tersedia. Setidaknya itu memecahkan kasus saya ketika saya harus membagi meja dengan bidang terlalu banyak.
sumber
Jika Anda memiliki kesalahan ini dengan Symfony menggunakan pembuat permintaan doktrin , dan jika kesalahan ini disebabkan oleh orderBy :
Perhatikan
select
kolom yang Anda inginkangroupBy
, dan gunakanaddGroupBy
bukannyagroupBy
:Bekerja pada Symfony3 -
sumber
Permintaan maaf karena tidak menggunakan SQL persis Anda
Saya menggunakan kueri ini untuk mengatasi peringatan Mysql.
perhatikan kuncinya bagi saya
sumber