Kesalahan terkait dengan only_full_group_by saat menjalankan kueri di MySql

442

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_bycukup mengerti untuk mencari tahu apa yang harus saya lakukan untuk memperbaiki kueri. Bisakah saya mematikan only_full_group_byopsi, atau ada hal lain yang perlu saya lakukan?

Beri tahu saya jika Anda membutuhkan informasi lebih lanjut.

Dan Bemowski
sumber
di sini saya menemukan solusi stackoverflow.com/a/7588442/612987
Wasim A.
21
Ini harus menjadi pesan kesalahan yang paling berbelit-belit yang pernah saya temui.
Rolf
2
@Rolf Pernahkah Anda melihat kesalahan untuk jenis masalah yang sama di Oracle? " not a GROUP BY expression" Itu dia. Mereka mungkin juga hanya memiliki kode kesalahan numerik dan tidak ada pesan sama sekali.
Bill Karwin

Jawaban:

360

Saya hanya akan menambahkan group_idke GROUP BY.

Saat SELECTmemasukkan kolom yang bukan bagian dari itu, GROUP BYmungkin 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 seperti COUNT(), 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 mengaktifkan only_full_group_bypengaturan 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_idunik. Sepertinya masuk akal, itu adalah 'ID' setelah semua.

2) group_nameitu juga unik. Ini mungkin bukan asumsi yang masuk akal. Jika ini bukan masalahnya dan Anda memiliki duplikat group_namesdan kemudian mengikuti saran saya untuk ditambahkan group_idke GROUP 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 ...

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
davmos
sumber
Terima kasih, itu bekerja dengan sempurna. Saya juga setuju bahwa saya harus memenuhi syarat kolom. Ini menghilangkan segala kemungkinan ambiguitas. Saya sedang dalam proses memperbaiki kode sekarang. Terima kasih banyak atas bantuannya.
Dan Bemowski
Saya bahkan tidak memiliki GROUP BYklausa dalam permintaan saya, namun saya mendapatkan kesalahan ini.
aitchkhan
@ HaroonKhan, itu terdengar seperti pertanyaan baru. Beri tahu saya jika Anda menanyakannya & saya akan memeriksanya.
davmos
2
Di MySQL 5.7, mereka menetapkan properti yang mengharuskan semua bidang non-agregat dalam kueri menjadi GROUP BY. Jadi query seperti SELECT a, SUM (b) FROM table; berarti bidang "a" harus dalam GROUP BY. Jadi, jika Anda tidak memiliki GROUP BY maka Anda harus menambahkannya ke kueri. Ini semua tentang apakah Anda memiliki setidaknya satu bidang agregat di bagian SELECT dari kueri Anda.
user1567291
saya harus memperbaiki "peringatan" dengan menambahkan item ke grup dengan klausa seperti yang disarankan dalam jawaban ini karena tidak ada jawaban yang menyarankan perbaikan sql_mode bekerja. (MySQL saya berada dalam prosedur tersimpan tetapi tidak tahu apakah itu relevan)
zzapper
355

Anda dapat mencoba menonaktifkan only_full_group_bypengaturan dengan menjalankan yang berikut:

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

MySQL 8 tidak menerima NO_AUTO_CREATE_USERsehingga perlu dihapus.

WeiYuan
sumber
85
Ini adalah solusi, lebih baik Anda memperbaiki pertanyaan Anda daripada membungkam peringatan
azerafati
1
Memperbarui /etc/mysql/my.cnf (seperti yang terlihat di bawah) adalah solusi yang lebih berkelanjutan karena pengaturan default cenderung kembali setelah restart. Dan bagi mereka yang mengatakan Anda harus memperbaiki kueri, maka itu tidak cukup mudah kadang-kadang ketika Anda membutuhkan permintaan debugging cepat dan melakukan hal-hal seperti SELECT COUNT(*), t.* FROM my_table t GROUP BY coldan Anda memiliki 20-50 kolom, apakah Anda ingin menghabiskan banyak waktu menambahkan setiap kolom ke dikelompokkan berdasarkan?
Shadoweb
3
"Solusi" ini cukup berbahaya. Anda dapat mengaktifkan mode yang sebelumnya telah dinonaktifkan dengan mengubahnya secara buta alih-alih hanya menghapus satu flag pengaturan yang dipermasalahkan. Hal ini dapat menyebabkan perilaku yang tidak terduga dan dalam kasus terburuk menyebabkan hasil yang salah atau menghentikan aplikasi Anda dari bekerja sepenuhnya. Jadi saya menganggap jawaban ini salah.
Chris S.
1
Saya membuat ini gigih melalui penyegaran dengan mencari tahu sql_mode saya saat ini melalui SELECT @@sql_mode;dan kemudian menambahkan hasilnya dari sana ke my.cnf:sql_mode=[list of modes from query, minus ONLY_FULL_GROUP_BY]
wbharding
323

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

Mysql perlu tahu baris mana dalam grup yang Anda cari, yang memberi Anda dua opsi

  • Anda juga dapat menambahkan kolom yang Anda inginkan ke pernyataan grup group by rect.color, rect.valueyang dapat menjadi apa yang Anda inginkan dalam beberapa kasus, jika tidak, akan mengembalikan hasil duplikat dengan warna yang sama yang mungkin tidak Anda inginkan
  • Anda juga bisa menggunakan fungsi agregat mysql untuk menunjukkan baris mana yang Anda cari di dalam grup seperti AVG() MIN() MAX() daftar lengkap
  • DAN akhirnya Anda dapat menggunakan ANY_VALUE()jika Anda yakin bahwa semua hasil di dalam grup adalah sama. dokter
azerafati
sumber
25
Saya tidak berpikir bahwa MySQL mendukung FIRST()metode / fungsi?
Ben Guild
3
Saya percaya bahwa MySQL (setidaknya sebelum 5.7) default untuk mengambil nilai pertama yang ditemukannya dalam grup. Jadi, tidak ada FIRST () karena dulu identik dengan fungsi GROUP BY itu sendiri.
DrDamnit
2
@DrDamnit, saya percaya itu lebih seperti pemilihan acak dalam kasus-kasus seperti itu yang menyebabkan kebingungan dan karenanya memungkinkan ONLY_FULL_GROUP_BYsecara default
azerafati
6
Saya sudah tahu jawabannya, tetapi contoh dengan persegi panjang berwarna sangat mudah dimengerti, saya akan menggunakannya kembali saat seseorang bertanya kepada saya tentang hal itu.
user327961
@azerafati apakah ada sesuatu seperti FIRST () atau beberapa permintaan yang dapat digunakan untuk mendapatkan nilai pertama, seperti halnya saya.
Haris
169

Jika Anda tidak ingin melakukan perubahan pada permintaan Anda saat ini, maka ikuti langkah-langkah di bawah ini -

  1. gelandangan ssh ke dalam kotak Anda
  2. Tipe: sudo vim /etc/mysql/my.cnf
  3. Gulir ke bawah file dan ketik Auntuk masuk ke mode memasukkan
  4. Salin dan tempel

    [mysqld]
    sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  5. Ketik escuntuk keluar dari mode input

  6. Ketik :wquntuk menyimpan dan menutup vim.
  7. Ketik sudo service mysql restartuntuk me-restart MySQL.
Ajai
sumber
Cukup tuju semua pengguna Vagrant yang mencoba menggunakan ini dengan AdonisJS, Anda memerlukan ini untuk menjalankan paginatefungsinya.
Michael J. Calkins
Ini jelas tidak hanya untuk pengguna Vagrant, tetapi sistem Unix. Perhatikan bahwa bagi saya lokasi my.cnffile 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"
Valentin Grégoire
Bekerja untuk saya di Mint 19.3 (ubuntu 18.04) terima kasih
Marco López
71

Gunakan ANY_VALUE()untuk merujuk ke kolom yang tidak teragregasi.

SELECT name,           address , MAX(age) FROM t GROUP BY name; -- fails
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name; -- works

Dari MySQL 5.7 dokumen :

Anda dapat mencapai efek yang sama tanpa menonaktifkan ONLY_FULL_GROUP_BY dengan menggunakan ANY_VALUE()untuk merujuk ke kolom yang tidak teragregasi.

...

Kueri ini mungkin tidak valid dengan ONLY_FULL_GROUP_BYdiaktifkan karena kolom alamat tidak teragregasi dalam daftar pilih tidak disebutkan dalam GROUP BYklausa:

SELECT name, address, MAX(age) FROM t GROUP BY name;

...

Jika Anda tahu bahwa, untuk kumpulan data yang diberikan, setiap nilai nama sebenarnya secara unik menentukan nilai alamat, alamat secara fungsional tergantung pada nama. Untuk memberi tahu MySQL agar menerima permintaan, Anda dapat menggunakan ANY_VALUE()fungsi:

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
Italo Borssatto
sumber
1
Sebagai seseorang yang telah mengalami masalah ini untuk sementara waktu sekarang - saya terutama menyukai solusi ini karena tidak mengharuskan Anda untuk mengubah file atau pengaturan di pengaturan MySQL Anda. Cukup menarik, saya tidak melihat ANY_VALUE disebutkan di tempat lain dalam diskusi serupa - bekerja sempurna untuk saya dengan GROUP_BY contains nonaggregated columnkesalahan saya .
adstwlearn
50

Saya akan mencoba menjelaskan kepada Anda apa kesalahan ini.
Mulai dari MySQL 5.7.5, opsi ONLY_FULL_GROUP_BYdiaktifkan secara default.
Jadi, menurut standart SQL92 dan sebelumnya:

tidak mengizinkan permintaan yang daftar pilih, kondisi MEMILIKI, atau daftar ORDER BY mengacu pada kolom yang tidak diagregasi yang tidak disebutkan dalam klausa GROUP BY juga tidak secara fungsional bergantung pada (ditentukan secara unik oleh) kolom GROUP BY

( baca lebih lanjut dalam dokumen )

Jadi, misalnya:

SELECT * FROM `users` GROUP BY `name`;

Anda akan mendapatkan pesan kesalahan setelah menjalankan kueri di atas.

# 1055 - Ekspresi # 1 dari daftar SELECT tidak dalam klausa GROUP BY dan berisi kolom 'testsite.user.id' yang tidak teragregasi, yang tidak secara fungsional bergantung pada kolom dalam klausa GROUP BY; ini tidak kompatibel dengan sql_mode = only_full_group_by

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 userstabel Anda :
yo

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 memiliki emailnilai 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:

SELECT `name` FROM `users` GROUP BY `name`

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):

SELECT ANY_VALUE(`id`), ANY_VALUE(`email`), `name` FROM `users` GROUP BY `name`

masukkan deskripsi gambar di sini

Sekarang, Anda mungkin bertanya, mengapa menggunakan ANY_VALUEsangat 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

SELECT `age`, COUNT(`age`) FROM `users` GROUP BY `age`;

Yang sepenuhnya valid, sesuai dengan aturan MySQL.
Dan seterusnya.

Penting untuk memahami apa sebenarnya masalahnya dan baru kemudian menuliskan solusinya.

Abraham Tugalov
sumber
Terima kasih atas jawaban yang bagus ini. Bagaimana jika saya ingin email juga, sebagai array di grup hasil?
Josiah
1
Anda selalu dapat mengelompokkan GROUP_CONCAT untuk mendapatkan setiap entri di sana.
Abraham Tugalov
Oh! jadi ada jalan! Tolong bantu saya dalam pertanyaan ini
Josiah
Terima kasih atas jawaban yang bagus ini. Bagaimana jika saya ingin melakukannya GROUP BY DAY(created_date)? Sepertinya tidak berfungsi jika DAY()ditambahkan.
eskimo
41

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.cnfuntuk mencerminkan:

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Saya masih menerima kesalahan.

Saya harus berubah config/database.phpdari truemenjadi false:

    'mysql' => [
        'strict' => false, //behave like 5.6
        //'strict' => true //behave like 5.7
    ], 

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

Ryan
sumber
Dang! Itu sangat membantu bagi pengguna Laravel. +1 untuk itu.
Okafor T Kosiso
20

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.

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
PiyaChakraborty
sumber
fantastis, membangun apa yang dia katakan, masukkan perintah show variables like '%sql_mode%';di baris perintah mysql, pengaturan sql_mode akan mengekspos
Jade Han
19

Penambahan baris (sebutkan di bawah) dalam file: /etc/mysql/my.cnf

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Bekerja dengan baik untukku. Versi server: 5.7.18-0ubuntu0.16.04.1 - (Ubuntu)

Jagdeep Singh
sumber
1
Apakah Anda menggunakan RDS?
Mubasshir Pawle
@MubasshirPawle No
Jagdeep Singh
16

Pergi ke mysql atau phpmyadmin dan pilih database kemudian jalankan query ini dan itu akan berfungsi. Ini bekerja dengan baik untuk saya.

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Anil Gupta
sumber
Hebat..Terima kasih :)
mohitesachin217
Saya senang :) @mohit
Anil Gupta
Menghemat saya banyak waktu, terima kasih.
JoeRaid
1
Selamat datang bro @TharinduEranga
Anil Gupta
1
Tetapi masalah dengan solusinya adalah setiap kali saya me-restart mysql saya harus menjalankan query lagi. Ini berarti solusinya tidak permanen atau persisten.
Mushfiqur Rahman
10

Untuk Mac:

1. Salin default my-default.cnf ke /etc/my.cnf

sudo cp $(brew --prefix mysql)/support-files/my-default.cnf /etc/my.cnf

2. Ubah sql_mode di my.cnf menggunakan editor favorit Anda dan atur ini

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

3. Mulai ulang server MySQL.

mysql.server restart
Tanvir Hasan Anick
sumber
Terima kasih, bekerja untuk saya juga. Tapi saya menggunakan default mysql untuk Mac, jadi saya tidak punya jalur pembuatan. Hanya sudo cp my-default.cnf /etc/my.cnf
Mike Nguyen
2
@Mike Nguyen sudo cp /usr/local/mysql-5.7.17-macos10.12-x86_64/support-files/my-default.cnf /etc/my.cnf sudo vi /etc/my.cnf set sql_model sql_mode = STRICTES_TRANS_TRANSTRANS , NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION Mulai ulang server MySQL.
Yong Gao
7

Inilah yang membantu saya untuk memahami keseluruhan masalah:

  1. https://stackoverflow.com/a/20074634/1066234
  2. https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

Dan dalam contoh berikut lain dari query yang bermasalah.

Bermasalah:

SELECT COUNT(*) as attempts, SUM(elapsed) as elapsedtotal, userid, timestamp, questionid, answerid, SUM(correct) as correct, elapsed, ipaddress FROM `gameplay`
                        WHERE timestamp >= DATE_SUB(NOW(), INTERVAL 1 DAY)
                        AND cookieid = #

Dipecahkan dengan menambahkan ini ke akhir:

  GROUP BY timestamp, userid, cookieid, questionid, answerid, elapsed, ipaddress

Catatan: Lihat pesan kesalahan dalam PHP, ia memberi tahu Anda di mana masalahnya.

Contoh:

Kesalahan kueri MySQL 1140: Dalam kueri gabungan tanpa GROUP BY, ekspresi # 4 dari daftar SELECT berisi kolom 'db.gameplay.timestamp' yang tidak teragregasi; ini tidak kompatibel dengan sql_mode = only_full_group_by - Query: SELECT COUNT (*) sebagai percobaan, SUM (berlalu) sebagai elapsedtotal, userid, timestamp, questionid, answerid, SUM (benar) benar, dilewati, ipaddress DARI gameplay WHERE timestamp> = DATE_SUBU (SEKARANG (), INTERVAL 1 HARI) DAN userid = 1

Dalam kasus ini, ekspresi # 4 tidak ada dalam GROUP BY.

Kai Noack
sumber
1
Terima kasih telah menunjukkan stackoverflow.com/questions/20074562/...
cwhsu
Jawaban yang bagus untuk menyelesaikan masalah ini. Terima kasih banyak
Hansana Athukorala
7

Untuk localhost / wampserver 3 kita dapat mengatur sql-mode = user_mode untuk menghapus kesalahan ini:

click on wamp icon -> MySql -> MySql Setting -> sql-mode -> user_mode

kemudian restart wamp atau apache

Braham Dev Yadav
sumber
1
Saya tahu ini mungkin bukan perbaikan jangka panjang untuk masalah ini, tetapi tentu saja membantu untuk saat ini. Perusahaan hosting saya, Go Daddy, menggunakan MySQL V5.6.33 dan WampServer 3 menggunakan MySQL V5.7.14. Terima kasih atas solusi perbaikan cepat ini
Alan N
4

Anda dapat menambahkan unique indexke group_id; jika Anda yakin itu group_idunik.

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.

micaball
sumber
2

Jika Anda memiliki kesalahan ini dengan Symfony menggunakan pembuat permintaan doktrin , dan jika kesalahan ini disebabkan oleh orderBy :

Perhatikan selectkolom yang Anda inginkan groupBy, dan gunakan addGroupBybukannya groupBy:

$query = $this->createQueryBuilder('smth')->addGroupBy('smth.mycolumn');

Bekerja pada Symfony3 -

Gangai Johann
sumber
1

Permintaan maaf karena tidak menggunakan SQL persis Anda

Saya menggunakan kueri ini untuk mengatasi peringatan Mysql.

SELECT count(*) AS cnt, `regions_id`
FROM regionables 
WHERE `regionable_id` = '115' OR `regionable_id` = '714'
GROUP BY `regions_id`
HAVING cnt > 1

perhatikan kuncinya bagi saya

count(*) AS cnt
Harry Bosh
sumber