AM menggunakan MySQL 5.7.13 di PC windows saya dengan WAMP Server
Di sini Masalah saya adalah Saat menjalankan kueri ini
SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
`status` = 'Active'
GROUP BY `proof_type`
Saya selalu mendapatkan kesalahan seperti ini
Ekspresi # 1 dari daftar SELECT tidak ada dalam klausa GROUP BY dan berisi kolom nonagregasi 'returntr_prod.tbl_customer_pod_uploads.id' yang tidak bergantung secara fungsional pada kolom dalam klausa GROUP BY; ini tidak sesuai dengan sql_mode = only_full_group_by
Bisakah Anda memberi tahu saya solusi terbaik ...
Saya membutuhkan Hasil seperti
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| id | user_id | load_id | bill_id | latitude | langitude | proof_type | document_type | file_name | is_private | status | createdon | updatedon |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| 1 | 1 | 78 | 1 | 21.1212 | 21.5454 | 1 | 1 | id_Card.docx | 0 | Active | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
mysql
group-by
mysql-error-1055
Dhanu K
sumber
sumber
SELECT *
.tbl_customer_pod_uploads
WHEREload_id
= '78' ANDstatus
= 'Active' GROUP BYproof_type
only_full_group_by
mode SQL.tbl_customer_pod_uploads
WHEREload_id
= '78' ANDstatus
= 'Active' GROUP BYproof_type
Jawaban:
Ini
akan diselesaikan dengan mengubah mode sql di MySQL dengan perintah ini,
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Ini juga berfungsi untuk saya .. Saya menggunakan ini, karena dalam proyek saya ada banyak Queries seperti ini jadi saya hanya mengubah mode sql ini menjadi only_full_group_by
Terima kasih... :-)
sumber
Ketika
only_full_group_by
mode MySQL diaktifkan, itu berarti aturan ANSI SQL yang ketat akan berlaku saat menggunakanGROUP BY
. Berkenaan dengan kueri Anda, ini berarti bahwa jika AndaGROUP BY
dariproof_type
kolom, maka Anda hanya dapat memilih dua hal:proof_type
kolom, atauDengan "agregat" dari kolom lain, maksud saya menggunakan fungsi agregat seperti
MIN()
,MAX()
atauAVG()
dengan kolom lain. Jadi dalam kasus Anda, kueri berikut akan valid:SELECT proof_type, MAX(id) AS max_id, MAX(some_col), MIN(some_other_col) FROM tbl_customer_pod_uploads WHERE load_id = '78' AND status = 'Active' GROUP BY proof_type
Sebagian besar
GROUP BY
pertanyaan MySQL yang saya lihat di SO memiliki mode ketat dimatikan, sehingga kueri berjalan, tetapi dengan hasil yang salah. Dalam kasus Anda, kueri tidak akan berjalan sama sekali, memaksa Anda untuk memikirkan tentang apa yang sebenarnya ingin Anda lakukan.Catatan: ANSI SQL memperluas apa yang diizinkan untuk dipilih
GROUP BY
dengan juga menyertakan kolom yang secara fungsional bergantung pada kolom yang dipilih. Contoh ketergantungan fungsional akan dikelompokkan berdasarkan kolom kunci utama dalam sebuah tabel. Karena kunci utama dijamin unik untuk setiap rekaman, oleh karena itu nilai kolom lain juga akan ditentukan. MySQL adalah salah satu database yang memungkinkan untuk ini (SQL Server dan Oracle tidak AFAIK).sumber
GROUP BY
hampir selalu merupakan ide yang buruk. Saya takut bahwa begitu banyak pengguna yang mengambil saran yang salah dan menggunakannya.Gunakan salah satu solusi
(1) PHPMyAdmin
jika Anda menggunakan phpMyAdmin, ubah pengaturan " sql_mode " seperti yang disebutkan pada gambar di bawah.
Edit variabel "mode sql" dan hapus teks "ONLY_FULL_GROUP_BY" dari nilainya
(2) SQL / Command prompt Jalankan perintah di bawah ini.
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
(3) Jangan gunakan SELECT *
Gunakan kolom yang relevan dalam kueri PILIH. relevan berarti kolom, yang ada di klausa "kelompok menurut" atau kolom dengan fungsi agregat (MAX, MIN, SUM, COUNT dll)
Catatan penting
Perubahan yang dibuat dengan menggunakan poin (1) ATAU poin (2) tidak akan mengaturnya secara PERMANEN, dan akan kembali setelah setiap restart.
Jadi Anda harus mengatur ini di file konfigurasi Anda (misalnya /etc/mysql/my.cnf di bagian [mysqld]), sehingga perubahan tetap berlaku setelah MySQL dimulai ulang:
File Konfigurasi: /etc/mysql/my.cnf
Nama variabel : sql_mode OR sql-mode
sumber
Metode di bawah ini memecahkan masalah saya:
Di ubuntu
Tipe:
sudo vi /etc/mysql/my.cnf
ketik A untuk masuk ke mode penyisipan
Di baris terakhir tempelkan di bawah dua kode baris:
Ketik esc untuk keluar dari mode masukan
Ketik
sudo service mysql restart
untuk memulai ulang MySQL.sumber
Anda dapat menonaktifkan sql_mode = only_full_group_by dengan beberapa perintah, Anda dapat mencoba ini dengan terminal atau MySql IDE
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';
sumber
Di Ubuntu
Langkah 1:
Langkah 2: Pergi ke baris terakhir dan tambahkan yang berikut ini
Langkah 3: Simpan
Langkah 4: Mulai ulang server mysql.
sumber
Anda dapat mengatasinya dengan mengubah mode sql dengan perintah ini:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
dan ... ingatlah untuk menyambungkan kembali database !!!
sumber
buka phpmyadmin dan buka konsol dan jalankan permintaan ini
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
sumber
Hai, alih-alih mengambil semua kolom, ambil saja apa yang Anda butuhkan dengan menggunakan
ANY_VALUE(column_name)
. Ini bekerja dengan sempurna. Cek saja.Misalnya:
SELECT proof_type,any_value("customer_name") as customer_name FROM `tbl_customer_pod_uploads` WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`
sumber
Cari "mode SQL" jika Anda menggunakan PhpMyAdmin dan hapus nilainya
ONLY_FULL_GROUP_BY
:, lakukan saja dan tidak masalah.sumber
Masuk di bawah
Ctrl + O => Y = Ctrl + X
sumber
Dari tampilannya, menurut saya pengelompokan berdasarkan beberapa kolom / bidang tidak akan merusak hasil Anda. Mengapa Anda tidak mencoba menambahkan ke grup dengan seperti ini:
Ini akan dikelompokkan
proof_type
terlebih dahuluid
. Saya harap ini tidak mengubah hasil. Dalam beberapa / kebanyakan kasus, kelompok dengan beberapa kolom memberikan hasil yang salah.sumber
Itu saja.
Saya melakukan ini di Ec2 saya dan itu bekerja seperti pesona.
sumber
Berikut ini cara yang sangat cepat dan mudah untuk mengaturnya secara permanen
NB: berjalan
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
bersifat sementara dan saat server restart Anda masih akan berakhir dengan kesalahan. Untuk memperbaikinya secara permanen lakukan hal di bawah iniwget https://gist.githubusercontent.com/nfourtythree/90fb8ef5eeafdf478f522720314c60bd/raw/disable-strict-mode.sh
chmod +x disable-strict-mode.sh
./disable-strict-mode.sh
Dan selesai, perubahan akan dilakukan pada mysql dan akan dimulai ulang
sumber
Pembaruan untuk MySQL 8.0
Anda
sql-mode
tidak akan memilikinyaNO_AUTO_CREATE_USER
karena telah dihapus seperti yang disebutkan di sini - how-to-set-sql-mode-in-my-cnf-in-mysql-8Juga jika seseorang tidak memiliki
my.cnf
file maka mereka membuat yang baru/etc/my.cnf
dan kemudian menambahkan baris di atas.sumber
Saya memiliki masalah serupa dengan bagian dari penghancuran database saya. Yang saya lakukan adalah mengubah parameter di DB melalui konsol database PHPStorm seperti ini:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
bekerja seperti pesona sekarang
sumber
Di Anda
my.ini
, tulis ini:tergantung pada versi Anda. Atau:
atau cukup hapus ini:
ONLY_FULL_GROUP_BY
sumber
Buka panel WAMP Anda dan buka file konfigurasi MySQL. Di dalamnya cari "sql_mode" jika Anda menemukannya setel ke "" lain jika Anda tidak menemukannya tambahkan sql_mode = "" ke file.
Mulai ulang server MySQL dan Anda siap melakukannya ...
selamat coding.
sumber