SELECT listesi GROUP BY yan tümcesinde değil ve toplanmamış sütun içeriyor… sql_mode = only_full_group_by ile uyumsuz


134

WAMP Sunuculu Windows PC'mde MySQL 5.7.13 kullanarak AM

İşte Benim Sorunum Bu sorguyu yürütürken

SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
      `status` = 'Active'
GROUP BY `proof_type`

Hep böyle hata alıyorum

SELECT listesinin 1 numaralı ifadesi, GROUP BY yan tümcesinde değildir ve işlevsel olarak GROUP BY yan tümcesindeki sütunlara bağlı olmayan toplulaştırılmamış 'returntr_prod.tbl_customer_pod_uploads.id' sütununu içerir; bu sql_mode = only_full_group_by ile uyumsuz

Lütfen bana en iyi çözümü söyler misiniz ...

Sonuca ihtiyacım var gibi

+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| 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 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+

12
Kullanmayın SELECT *.
shmosel


şöyle diyor: SELECT id FROM tbl_customer_pod_uploadsWHERE load_id= '78' AND status= 'Active' GROUP BYproof_type
Dhanu K

2
Eski sorgular için uyumluluk istiyorsanız, only_full_group_bySQL modunu kapatabilirsiniz .
Barmar

5
ANY_VALUE (kanıt_türü) kullanmayı deneyin: dev.mysql.com/doc/refman/5.7/en/group-by-handling.html SELECT *, ANY_VALUE (prova_türü) FROM tbl_customer_pod_uploadsWHERE load_id= '78' AND status= 'Active' GROUP BYproof_type
AlexGach

Yanıtlar:


259

Bu

SELECT listesinin 1 numaralı ifadesi, GROUP BY yan tümcesinde değildir ve işlevsel olarak GROUP BY yan tümcesindeki sütunlara bağlı olmayan toplulaştırılmamış 'returntr_prod.tbl_customer_pod_uploads.id' sütununu içerir; bu sql_mode = only_full_group_by ile uyumsuz

bu komutla MySQL'deki sql modunu değiştirerek basitçe çözülecektir,

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Bu da benim için çalışıyor .. Bunu kullandım, çünkü projemde bunun gibi birçok Sorgu var, bu yüzden bu sql modunu only_full_group_by olarak değiştirdim.

Teşekkür ederim... :-)


14
Benim için çalışıyor !. Günümü kurtardın. MYSQL HİZMETİNİ YENİDEN
BAŞLATMAYI

2
Kod işaretleyici kullanıyorsam ve modelde çalıştırmak istersem, onu nasıl kullanırım? Yardım edebilir misin ? @marcode_ely
DhavalThakor

@DhavalThakor, bu sorguyu sunucunuzda çalıştırdığınızda, tekrar tekrar çalıştırmanıza gerek kalmaz. yani onu modelinize koymanıza gerek yok
Dhanu K

2
MySQL 5.7.29, hizmeti yeniden başlatmaya gerek yoktu
Taavi

Şu sunucu sürümünü kullanıyorum: 5.7.31-0ubuntu0.16.04.1 - (Ubuntu) ve makinemi her başlattığımda her seferinde ayarlıyorum, bunun için kalıcı bir düzeltme var mı?
Arpita Hunka

81

MySQL only_full_group_bymodu açıldığında, kullanım sırasında katı ANSI SQL kurallarının uygulanacağı anlamına gelir GROUP BY. Sorgunuzla ilgili olarak, bu GROUP BY, proof_typesütundan iseniz, yalnızca iki şey seçebileceğiniz anlamına gelir :

  • proof_typeKolon ya da
  • başka herhangi bir sütunun toplamları


Diğer sütunlar "agrega" ile, böyle olarak bir toplama işlevi kullanılarak anlamına MIN(), MAX()veya AVG()başka bir sütun ile. Yani sizin durumunuzda aşağıdaki sorgu geçerli olacaktır:

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

SO'da GROUP BYgördüğüm MySQL sorularının büyük çoğunluğunda katı mod kapalı, bu yüzden sorgu çalışıyor, ancak yanlış sonuçlar veriyor. Sizin durumunuzda, sorgu hiç çalışmayacak ve sizi gerçekten ne yapmak istediğinizi düşünmeye zorlayacaktır.

Not: ANSI SQL GROUP BY, fonksiyonel olarak seçilen sütun (lar) a bağlı olan sütunları da dahil ederek seçilmesine izin verileni genişletir . İşlevsel bağımlılığa bir örnek, bir tablodaki birincil anahtar sütununa göre gruplama olabilir. Birincil anahtarın her kayıt için benzersiz olması garanti edildiğinden, diğer herhangi bir sütunun değeri de belirlenecektir. MySQL buna izin veren veri tabanlarından biridir (SQL Server ve Oracle AFAIK yapmaz).


2
Sadece bir not: Sonuç yanlış değildir (MySQL kurallarını izler), ancak tahmin edilemez, yani, grubun parçası olmayan ve toplanmayan (ve işlevsel olarak bağımlı olmayan) sütunlar, karşılık gelen gruptan bir 'rastgele' değer döndürür. Kılavuzda belirtildiği gibi: "sunucu her gruptan herhangi bir değeri seçmekte özgürdür"
Pred

Kesin gruplamanın ihlal edilmesi, mutlaka yanlış sonuçlar üretmez. Bunu genellikle alanların aynı olması garanti edildiğinde yaparım (örneğin bire çok birleştirme). Ve garantili olmasa bile, rastgele bir satır seçmek genellikle bir toplama işlevi kullanmaktan veya bir gruplama düzeyi eklemekten daha fazla yanlış olmayacaktır.
shmosel

1
Benim için +1. Yukarıdaki "kabul" cevabının neden kabul edildiğine dair hiçbir fikrim yok. Sizin yolunuz doğru yoldur ve kabul edilen cevap, gelecekte daha fazla soruna yol açacak olağan karmaşık düzeltmedir.
Jcov

1
@Jcov ... ve yorumunuza daha fazla katılamadım +1. ANSI kısıtlamasını kapatmak GROUP BYneredeyse her zaman kötü bir fikirdir. Bu kadar çok kullanıcının yanlış tavsiye alması ve onu kullanması beni korkutuyor.
Tim Biegeleisen

1
@TimBiegeleisen modern kopyala + yapıştır geliştirmeye hoş geldiniz. "Güvenilmez bir kaynaktan rastgele bir şey okuyan biri benim için düşünmeyi çoktan yaptı" diye düşünmeme gerek yok.
Jcov

48

Herhangi bir çözümü kullanın

(1) PHPMyAdmin

phpMyAdmin kullanıyorsanız , aşağıdaki ekran görüntüsünde belirtildiği gibi " sql_mode " ayarını değiştirin . görüntü açıklamasını buraya girin

"Sql mode" değişkenini düzenleyin ve "ONLY_FULL_GROUP_BY" metnini değerden kaldırın

(2) SQL / Komut istemi Aşağıdaki komutu çalıştırın.

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

(3) SELECT'i kullanmayın *

SELECT sorgusunda ilgili sütunu kullanın. alakalı sütunlar, "grupla" yan tümcesine veya toplama işlevine sahip sütuna (MAX, MIN, SUM, COUNT vb.)


Önemli Not

Nokta (1) VEYA noktası (2) kullanılarak yapılan değişiklikler onu KALICI OLARAK ayarlamaz ve her yeniden başlatmadan sonra geri döner.

Bu nedenle, MySQL yeniden başlatıldıktan sonra değişikliklerin etkin kalması için bunu yapılandırma dosyanızda (örneğin [mysqld] bölümünde /etc/mysql/my.cnf) ayarlamalısınız:

Yapılandırma Dosyası : /etc/mysql/my.cnf

Değişken adı : sql_mode VEYA sql-mode


Yukarıdaki cevap için çok teşekkür ederim. Bunu my.cnf dosyamda söylediğin gibi değiştirmek istiyorum. Ancak bu dosyayı açtığımda, yalnızca salt okunur modda açılıyor. Herhangi bir yardım veya referans bağlantısı ???. Ubuntu 16.04 kullanıyorum
Sanmitha Sadhishkumar

1
(1) my.cnf dosyasının dosya iznini "chmod" komutunu kullanarak değiştirin. (2) my.cnf'de değişiklikler yapın (3) tekrar salt okunur olarak ayarlayın ("chmod" kullanarak dosya iznini tekrar değiştirin) (4)
mysql'i

21

Aşağıdaki yöntem sorunumu çözdü:

Ubuntu'da

Tür: sudo vi /etc/mysql/my.cnf

ekleme moduna girmek için A yazın

Son satırda iki satır kodun altına yapıştırın:

[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

Giriş modundan çıkmak için esc yazın

Type :wq to save and close vim.

Tip sudo service mysql restartMySQL yeniden başlatmak için.


1
teşekkürler, işe yaradı! cent os, whm, my.cnf sudo vi
/etc/my.cnf

19

Sql_mode = only_full_group_by'yi bazı komutlarla devre dışı bırakabilirsiniz , bunu terminal veya MySql IDE ile deneyebilirsiniz.

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';

12

Ubuntu'da

Aşama 1:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

Adım 2: Son satıra gidin ve aşağıdakileri ekleyin

sql_mode = ""

3. Adım: Kaydet

Adım 4: mysql sunucusunu yeniden başlatın.


9

SQL92'de sorgunun yasal olması için ad sütununun seçim listesinden çıkarılması veya GROUP BY yan tümcesinde adlandırılması gerekir.

SQL99 ve sonraki sürümler, işlevsel olarak GROUP BY sütunlarına bağlı iseler, isteğe bağlı T301 özelliği için bu tür topaklaşmayanlara izin verir: Ad ve custid arasında böyle bir ilişki varsa, sorgu yasaldır. Bu, örneğin, müşterilerin birincil anahtarlarından biri olsaydı böyle olurdu.

MySQL 5.7.5 ve üstü, işlevsel bağımlılığın tespitini gerçekleştirir. ONLY_FULL_GROUP_BY SQL modu etkinleştirilmişse (varsayılan olarak budur), MySQL seçim listesinin, HAVING koşulunun veya ORDER BY listesinin GROUP BY yan tümcesinde adlandırılmayan veya işlevsel olarak bunlara bağlı olmayan toplanmamış sütunlara atıfta bulunduğu sorguları reddeder. .

MySQL üzerinden :: MySQL 5.7 Başvuru Kılavuzu :: 12.19.3 MySQL ile GROUP BY ile İşleme

Bu komut ile sql modunu değiştirerek çözebilirsiniz:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

ve ... veritabanını yeniden bağlamayı unutmayın !!!


5

phpmyadmin'e gidin ve konsolu açın ve bu isteği gerçekleştirin

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

4

Merhaba, tüm sütunları almak yerine, sadece ihtiyacınız olanı kullanarak alın ANY_VALUE(column_name) . Mükemmel çalışıyor. Sadece kontrol et.

Örneğin:

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`

3

PhpMyAdmin kullanıyorsanız "SQL modunu" arayın ve değeri çıkarın:, ONLY_FULL_GROUP_BYsadece yaptım ve tamam.


3
> sudo nano /etc/mysql/my.cnf

Aşağıya girin

[mysqld]
sql_mode = ""

Ctrl + O => Y = Ctrl + X

> sudo service mysql restart

2

Görünüşünden, birden fazla sütun / alana göre gruplamanın sonucunuza zarar vermeyeceğini düşünüyorum . Neden şu şekilde gruba eklemeyi denemiyorsun:

GROUP BY `proof_type`, `id`

Bu, proof_type önce gruplanacaktır id. Umarım bu sonuçları değiştirmez. Bazı / çoğu durumda birden çok sütuna göre gruplama yanlış sonuçlar verir.


1
  1. PhpMyAdmin'de oturum açın
  2. Şuraya gidin: Sunucu: localhost: 3306 ve herhangi bir veritabanı seçmeyin
  3. Üst menüden değişkenlere tıklayın
  4. "Sql modu" arayın ve karşılık gelen değeri şu şekilde düzenleyin: NO_ENGINE_SUBSTITUTION

Bu kadar.

Bunu Ec2'mde yaptım ve çekicilik gibi çalıştı.


1

İşte kalıcı olarak ayarlamanın gerçekten hızlı ve kolay bir yolu

Not: Çalıştırma SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); geçicidir ve sunucu yeniden başlatıldığında yine de hatayla karşılaşacaksınız. Bunu kalıcı olarak düzeltmek için aşağıdakileri yapın

  1. Sunucunuza root olarak giriş yapın
  2. senin terminal koşusunda wget https://gist.githubusercontent.com/nfourtythree/90fb8ef5eeafdf478f522720314c60bd/raw/disable-strict-mode.sh
  3. Komut dosyasını çalıştırarak yürütülebilir hale getirin chmod +x disable-strict-mode.sh
  4. Komut dosyasını çalıştırarak çalıştırın. ./disable-strict-mode.sh

Ve yaptınız, mysql'de değişiklikler yapılacak ve yeniden başlatılacak


0

MySQL 8.0 için güncelleme

Sizin -cnf-in-my-cnf-in-mysql-8'de belirtildiği gibi kaldırıldığı gibi sql-modeolmayacak NO_AUTO_CREATE_USER- nasıl-ayarlanır-sql-modu

[mysqld]
sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

Ayrıca birinin my.cnfdosyası yoksa, o zaman yeni bir dosya oluşturur /etc/my.cnfve ardından yukarıdaki satırları ekler.


0

Veritabanımın parçalanmasında benzer bir sorun yaşadım. Yaptığım şey, DB'deki parametreyi PHPStorm veritabanı konsolu aracılığıyla şu şekilde değiştirdim:

   SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

şimdi cazibe gibi çalışıyor


0

only_full_group_byYalnızca ne yaptığınızı biliyorsanız kapatın !

Sorunu göstermek için basit bir örnek:

Tablo: kullanıcılar

 id   |  name
----------------
  1      ali
  2      john
  3      ali

Kullandığınızda GROUP BY üzerine namesütunda:

SELECT * FROM users GROUP BY name;

Olası iki sonuç vardır:

  1      ali
  2      john     

VEYA

  2      john
  3      ali

MYSQL hangi sonucu seçeceğini bilmiyor! Çünkü farklıid ler var ama ikisi de var name=ali.

Çözüm 1:

sadece seçmek name alanı :

Kullanıcılardan GRUP ADINA GÖRE AD SEÇİN;

sonuç:

  ali
  john     

Çözüm2:

Kapanıyor only_full_group_by. MYSQL size daha önce RANDOMLY gösterdiğim iki olası sonuçtan birini gösterecek! (Ne idseçeceğini gerçekten umursamıyorsan sorun değil )

Çözüm3

Bir kullan Aggregategibi işlev MIN(),MAX()MYSQL'in neyi seçmesi gerektiğine karar vermesine yardımcı olmak için .

örneğin minimum istiyorum id:

SELECT MIN(id), name FROM users GROUP BY name;

sonuç:

  1      ali
  2      john     

aliAsgari olan satırı seçecektir id.


-2

Senin içine şunu my.iniyaz:

[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"

versiyonunuza bağlıdır. Veya:

[mysqld]
sql_mode = ""

veya basitçe şunu kaldırın: ONLY_FULL_GROUP_BY


-2

WAMP panelinizi açın ve MySQL yapılandırma dosyasını açın. İçinde "sql_mode" araması yaparsanız, "" olarak ayarlarsanız, yoksa dosyaya sql_mode = "" ekleyin.

MySQL sunucusunu yeniden başlatın ve gitmekte fayda var ...

mutlu kodlama.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.