MySql'de bir sorgu yürütülürken only_full_group_by ile ilgili hata


442

Sistemimi yükselttim ve üzerinde çalıştığım bir web uygulaması için php ile MySql 5.7.9'u yükledim. Dinamik olarak oluşturulan bir sorgu var ve MySql eski sürümlerinde çalıştırıldığında iyi çalışıyor. 5.7'ye yükseltme yaptığımdan beri bu hatayı alıyorum:

SELECT listesinin 1. ifadesi GROUP BY deyiminde değil ve GROUP BY deyimindeki sütunlara işlevsel olarak bağımlı olmayan birleştirilmiş 'support_desk.mod_users_groups.group_id' sütununu içeriyor; bu sql_mode = only_full_group_by ile uyumsuz

Sunucu SQL Modları konusundaki Mysql 5.7 için El Kitabı sayfasına dikkat edin .

Bu bana sorun çıkartan sorgu:

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

Bu konuda bazı googling yaptım, ancak only_full_group_bysorguyu düzeltmek için ne yapmam gerektiğini anlamaya yetmiyor. only_full_group_bySeçeneği kapatabilir miyim yoksa yapmam gereken başka bir şey var mı?

Daha fazla bilgiye ihtiyacınız varsa bana bildirin.



21
Bu şimdiye kadar karşılaştığım en kıvrımlı hata mesajı olmalı.
Rolf

2
@Rolf Oracle'da aynı sorun türüne ilişkin hatayı gördünüz mü? " not a GROUP BY expression" Hepsi bu. Sayısal bir hata koduna sahip olabilirler ve hiç mesaj olmayabilirler.
Bill Karwin

Yanıtlar:


359

Sadece eklersiniz group_idiçin GROUP BY.

Bir SELECTsütunun parçası olmayan bir GROUP BYsütun eklenirken, gruplar içinde bu sütun için birden fazla değer olabilir, ancak sonuçlarda yalnızca tek bir değer için yer olacaktır. Bu nedenle, veritabanına genellikle bu çoklu değerlerin nasıl tek bir değere dönüştürüleceği anlatılmalıdır. Genellikle, böyle bir toplama işlevi ile yapılır COUNT(), SUM(), MAX()vb ... diyorum genellikle diğer birçok popüler veritabanı sistemleri bu ısrar çünkü. Ancak, 5.7 sürümünden önceki MySQL'de, varsayılan davranış daha affedicidir çünkü şikayet etmeyecek ve daha sonra keyfi olarak herhangi bir değer seçmeyecektir ! Ayrıca birANY_VALUE()gerçekten aynı davranışa ihtiyaç duyuyorsanız, bu soruya başka bir çözüm olarak kullanılabilecek bir işlev. Bu esnekliğin bir maliyeti vardır çünkü deterministik değildir, bu yüzden ihtiyacınız için çok iyi bir nedeniniz yoksa bunu tavsiye etmem. MySQL şimdi only_full_group_byayarı iyi nedenlerle varsayılan olarak açıyor, bu yüzden buna alışmak ve sorgularınızı ona uydurmak en iyisidir.

Peki neden yukarıdaki basit cevabım? Birkaç varsayım yaptım:

1) group_idbenzersizdir. Makul görünüyor, sonuçta bir 'kimlik'.

2) group_nameaynı zamanda benzersizdir. Bu böyle makul bir varsayım olmayabilir. Bu durumda değilse ve bazı yinelenen varsa group_namesve eklemek group_idiçin tavsiyemi takip GROUP BYederseniz, şimdi aynı önceliğe sahip grupların sonuçlarda ayrı satırları olacağından, eskisinden daha fazla sonuç elde edebilirsiniz. Bana göre, bu yinelenen grupların gizlenmesinden daha iyi olurdu çünkü veritabanı sessizce keyfi olarak bir değer seçti!

Birden fazla tablo olduğunda tüm sütunları tablo adları veya diğer adları ile nitelemek de iyi bir uygulamadır ...

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

Teşekkürler, bu mükemmel çalışıyor. Ayrıca, sütunları nitelendirmem gerektiğini de kabul ediyorum. Herhangi bir belirsizlik olasılığını ortadan kaldırır. Şimdi kodu onarma sürecindeyim. Yardım için bir milyon teşekkürler.
Dan Bemowski

Hatta GROUP BYbenim sorguda bir cümle yok, henüz bu hatayı alıyorum.
aitchkhan

@HaroonKhan, kulağa yeni bir soru gibi geliyor. İsterseniz bana bildirin, ben de bir göz atacağım.
davmos

2
MySQL 5.7'de bir sorgudaki tüm birleşik olmayan alanları gerektiren bir özellik BY GROUP tarafından ayarlanır. Bu nedenle SELECT a, SUM (b) FROM tablosundan bir sorgu; "a" alanı GROUP BY grubunda olmalıdır. Yani bir GROUP BY yoksa sorguya eklemeniz gerekir. Her şey, sorgunuzun SELECT bölümünde en az bir toplam alanınız olup olmadığıyla ilgilidir.
user1567291

sql_mode düzeltmeleri öneren cevap hiçbiri çalıştı çünkü bu cevaba göre gruba madde ekleyerek "uyarı" düzeltmek zorunda kaldı. (MySQL
cihazım

355

only_full_group_byAşağıdakileri uygulayarak ayarı devre dışı bırakmayı 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';

MySQL 8 kabul edilmediğinden NO_AUTO_CREATE_USERkaldırılması gerekiyor.


85
Bu etrafında bir çalışma, uyarı susturmak yerine sorgunuzu düzeltmek daha iyi
azerafati

1
/Etc/mysql/my.cnf dosyasını (aşağıda görüldüğü gibi) güncellemek, varsayılan ayarlar yeniden başlatıldıktan sonra geri gelme eğiliminde olduğundan daha sürdürülebilir bir çözümdür. Sorguyu düzeltmeniz gerektiğini söyleyenler için, hızlı bir hata ayıklama sorgusuna ihtiyaç duyduğunuzda SELECT COUNT(*), t.* FROM my_table t GROUP BY colve 20-50 sütununuz olduğunda bazen çok kolay değil , her sütunu gruplandır?
Shadoweb

3
Bu "çözüm" oldukça tehlikelidir. Daha önce devre dışı bıraktığınız modları, yalnızca söz konusu ayar bayrağını kaldırmak yerine körü körüne değiştirerek etkinleştirebilirsiniz. Bu, beklenmedik davranışlara ve en kötü durumda yanlış sonuçlara yol açabilir veya uygulamalarınızın tamamen çalışmasını durdurabilir. Bu yüzden bu cevabı yanlış olarak görüyorum.
Chris S.

1
Ben mevcut sql_mode üzerinden SELECT @@sql_mode;sql_mode=[list of modes from query, minus ONLY_FULL_GROUP_BY]
anlayarak

323

uyarı mesajını diğer yanıtlarda açıklandığı gibi kapatabilir veya ne olduğunu anlayabilir ve düzeltebilirsiniz.

MySQL 5.7.5'ten itibaren, varsayılan SQL modu ONLY_FULL_GROUP_BY içerir, yani satırları grupladığınızda ve daha sonra bu gruplardan bir şey seçerken, bu seçimin hangi satırdan yapılması gerektiğini açıkça söylemeniz gerekir. Mysql, grupta hangi satırı aradığınızı bilmelidir, bu size iki seçenek sunar

Mysql, grupta hangi satırı aradığınızı bilmelidir, bu size iki seçenek sunar

  • İsterseniz, group by rect.color, rect.valuebazı durumlarda istediğiniz gibi olabilen grup ifadesine istediğiniz sütunu da ekleyebilirsiniz; aksi takdirde, istemeyebileceğiniz aynı renkle yinelenen sonuçlar döndürür
  • tam liste gibi grupların içinde hangi satırı aradığınızı belirtmek için mysql toplam işlevlerini de kullanabilirsinizAVG() MIN() MAX()
  • VE son olarak ANY_VALUE(), grup içindeki tüm sonuçların aynı olduğundan eminseniz kullanabilirsiniz . doktor

25
MySQL'in FIRST()yöntemi / işlevi desteklediğini düşünmüyorum ?
Ben Guild

3
MySQL'in (en azından 5.7'den önce) bir grupta bulduğu ilk değeri almaya varsayılan olduğunu düşünüyorum. Yani, FIRST () yoktur çünkü eskiden GROUP BY işlevinin kendisiyle eşanlamlıdır.
DrDamnit

2
@DrDamnit, karışıklığa yol açan ve böylece ONLY_FULL_GROUP_BYvarsayılan olarak etkinleştiren bu gibi durumlarda rastgele seçim gibi olduğuna inanıyorum
azerafati

6
Cevabı zaten biliyordum, ama renkli dikdörtgenin örneğini anlamak çok kolay, bir dahaki sefere birisi bana bunu sorduğunda tekrar kullanacağım.
user327961

@azerafati, FIRST () gibi bir şey veya ilk değeri elde etmek için kullanılabilecek bir sorgu var.
Haris

169

Mevcut sorgunuzda herhangi bir değişiklik yapmak istemiyorsanız aşağıdaki adımları izleyin -

  1. kutunuza vagrant ssh
  2. Tür: sudo vim /etc/mysql/my.cnf
  3. Dosyanın altına gidin ve Aekleme moduna girmek için yazın
  4. Kopyala ve yapıştır

    [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. Tip escçıkış giriş moduna

  6. Tip :wqkaydedip kapatın vim için.
  7. Tip sudo service mysql restartMySQL yeniden başlatmak için.

Sadece AdonisJS ile bunu kullanmaya çalışan tüm Vagrant kullanıcılarına bir kafa paginatefonksiyonu çalıştırmak için buna ihtiyacınız var .
Michael J. Calkins

Bu sadece Vagrant kullanıcıları için değil, herhangi bir Unix sistemi içindir. Benim için my.cnfdosyanın konumunun olduğunu unutmayın /etc. Als, yeni sözdizimini not ettiMySQL 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

Mint 19.3 (Ubuntu 18.04) benim için çalışıyor teşekkürler
Marco López

71

ANY_VALUE()Birleştirilmemiş sütuna başvurmak için kullanın .

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

Gönderen MySQL 5.7 docs :

Toplanmamış sütuna başvurmak için düğmesini ONLY_FULL_GROUP_BY kullanarak devre dışı bırakmadan aynı efekti elde edebilirsiniz ANY_VALUE().

...

ONLY_FULL_GROUP_BYSeçim listesinde toplanmamış adres sütunu yan tümcede adlandırılmadığından, bu sorgu etkinleştirildiğinde geçersiz olabilir GROUP BY:

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

...

Belirli bir veri kümesi için, her ad değerinin aslında adres değerini benzersiz bir şekilde belirlediğini biliyorsanız, adres etkin bir şekilde isme etkin bir şekilde bağlıdır. MySQL'e sorguyu kabul etmesini bildirmek için şu ANY_VALUE()işlevi kullanabilirsiniz :

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

1
Bir süredir bu sorunla karşılaşan biri olarak - özellikle bu çözümü beğendim çünkü MySQL kurulumunuzdaki herhangi bir dosyayı veya ayarı değiştirmenizi gerektirmiyor. İlginçtir, ANY_VALUE benzer tartışmalarda başka hiçbir yerde bahsetmiyorum - hatam için mükemmel çalışıyor GROUP_BY contains nonaggregated column.
adstwlearn

50

Bu hatanın ne hakkında olduğunu açıklamaya çalışacağım.
MySQL 5.7.5 sürümünden başlayarak, seçenek ONLY_FULL_GROUP_BYvarsayılan olarak etkindir.
Bu nedenle, standart SQL92 ve önceki sürümlere göre:

seçim listesinin, HAVING koşulunun veya ORDER BY listesinin, GROUP BY yan tümcesinde adlandırılmamış olan veya GROUP BY sütunlarına işlevsel olarak bağımlı olmayan (benzersiz olarak belirlenen) birleştirilmemiş sütunlara başvurduğu sorgulara izin vermez

( dokümanlarda daha fazla bilgi edinin )

Yani mesela:

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

Yukarıdaki sorguyu çalıştırdıktan sonra hata mesajı alırsınız.

# 1055 - SELECT listesinin 1. ifadesi GROUP BY yan tümcesinde değil ve GROUP BY yan tümcesindeki sütunlara işlevsel olarak bağımlı olmayan toplanmamış sütun 'testsite.user.id' içeriyor; bu sql_mode = only_full_group_by ile uyumsuz

Neden?
MySQL tam olarak anlamadığı için, gruplanmış kayıtlardan hangi değerlerin alınacağını tam olarak anlayamıyorum ve bu nokta.

IE userstablonuzda bu kayıtları olduğunu söyleyelim :
Yo

Ve yukarıda gösterilen geçersiz bir sorgu yürüteceksiniz.
Ve yukarıda gösterilen hatayı alacaksınız, çünkü adlı 3 kayıt var Johnve güzel, ancak hepsinin farklı emailalan değerleri var.
Bu nedenle, MySQL bunlardan hangisini sonuçlanan gruplanmış kayıtta döndüreceğini anlamıyor.

Sorgunuzu aşağıdaki gibi değiştirerek bu sorunu çözebilirsiniz:

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

Ayrıca, SELECT (SEÇ) bölümüne daha fazla alan eklemek isteyebilirsiniz, ancak toplanmazlarsa bunu yapamazsınız, ancak kullanabileceğiniz koltuk değneği vardır (ancak çok tavsiye edilmez):

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

resim açıklamasını buraya girin

Şimdi, neden kullanmanız ANY_VALUEönerilmez?
MySQL, gruplanmış kayıtların hangi değerinin alınacağını tam olarak bilmediğinden ve bu işlevi kullanarak, bunlardan herhangi birini almasını istersiniz (bu durumda, ad = John olan ilk kaydın e-postası getirildi).
Tam olarak bu davranışın neden olmasını istediğinize dair herhangi bir fikir bulamıyorum.

Lütfen, beni anlamıyorsanız, MySQL'de gruplamanın nasıl çalıştığı hakkında daha fazla bilgi edinin, çok basittir.

Ve sonunda, burada daha basit ama geçerli bir sorgu var.
Toplam kullanıcı sayısını kullanılabilir yaşlara göre sorgulamak istiyorsanız, bu sorguyu yazmak isteyebilirsiniz

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

Tamamen geçerli olan MySQL kurallarına göre.
Ve bunun gibi.

Sorunun tam olarak ne olduğunu anlamak ve ancak o zaman çözümü yazmak önemlidir.


Bu güzel cevap için teşekkürler. Sonuç grubunda bir dizi olarak e-postaları da istersem ne olur?
Josiah

1
Orada her girişi almak için GROUP_CONCAT gerekli alanı her zaman yapabilirsiniz.
Abraham Tugalov

Ah! yani bir yolu var! Lütfen bu soruda
Josiah

Bu harika cevap için teşekkürler. Ne yapmak istersem GROUP BY DAY(created_date)? Eklenirse çalışmıyor gibi görünüyor DAY().
eskimo

41

Laravel 5.3, MySQL 5.7.12, Laravel Homestead kullanıyorum (0.5.0, inanıyorum)

Düzenlemeyi açıkça /etc/mysql/my.cnfyansıtacak şekilde ayarladıktan sonra bile :

[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

Hala hatayı alıyordum.

Değiştirmek zorunda kaldım config/database.php den trueiçin false:

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

Daha fazla okuma:

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


Dang! Bu Laravel kullanıcıları için yararlı oldu. Bunun için +1.
Okafor T Kosiso

20

Wamp 3.0.6 veya kararlı 2.5 dışında herhangi bir üst sürüm kullanıyorsanız, bu sorunla karşılaşabilirsiniz, öncelikle sorun sql ile. alanları buna göre adlandırmanız gerekir. ama çözmenin başka bir yolu daha var. wamp yeşil simgesini tıklayın. mysql-> mysql ayarları-> sql_mode-> yok. veya konsoldan varsayılan değerleri değiştirebilirsiniz.

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

fantastik, söylediklerine dayanarak show variables like '%sql_mode%';, mysql komut satırına komut ekle , sql_mode ayarı ortaya çıkaracak
Jade Han

19

Dosyaya satır ekleme (aşağıda belirtin): /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

Benim için iyi çalış. Sunucu sürümü: 5.7.18-0ubuntu0.16.04.1 - (Ubuntu)


1
RDS kullanıyor musunuz?
Mübarek Pawle

@MubasshirPawle No
Jagdeep Singh

16

Mysql veya phpmyadmin'e gidin ve veritabanını seçin, ardından bu sorguyu yürütün ve çalışacaktır. Benim için iyi çalışıyor.

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

Great..Thank :)
mohitesachin217

My zevk :) @mohit
Anil Gupta

Bana bir ton zaman kazandım, teşekkürler.
JoeRaid

1
Welcome bro @TharinduEranga
Anil Gupta

1
Ama çözüm ile ilgili sorun mysql her yeniden başlattığınızda ben tekrar sorguyu yürütmek gerekiyor. Bu, çözümün kalıcı veya kalıcı olmadığı anlamına gelir.
Mushfiqur Rahman

10

Mac için:

1.Varsayılan-varsayılan.cnf'yi /etc/my.cnf olarak kopyalayın

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

2. favori düzenleyicinizi kullanarak my.cnf dosyasındaki sql_mode dosyasını değiştirin ve buna ayarlayın

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 sunucusunu yeniden başlatın.

mysql.server restart

Teşekkürler, benim için de çalıştı. Ama Mac mysql varsayılan kullanın, bu yüzden demlemek yolu yok. Sadece 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 = STRICT_TRANS_TABLES , NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION MySQL sunucusunu yeniden başlat.
Yong Gao

7

Tüm konuyu anlamama yardımcı olan şey buydu:

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

Aşağıdaki sorunlu bir sorgu örneği.

Sorunlu:

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 = #

Bunu sonuna ekleyerek çözüldü:

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

Not: PHP'deki hata mesajına bakın, sorunun nerede olduğunu söyler.

Misal:

MySQL sorgu hatası 1140: GROUP BY içermeyen birleştirilmiş sorguda, SELECT listesinin # 4 ifadesi toplanmamış sütun 'db.gameplay.timestamp'; bu sql_mode = only_full_group_by ile uyumlu değil - Sorgu: deneme olarak SELECT COUNT (*), geçen gibi SUM (geçen), WHERE zaman damgası WHERE zaman damgası> = DATE_SUB (ŞİMDİ (), ARALIK 1 GÜN) VE kullanıcı kimliği = 1

Bu durumda, GROUP BY ifadesinde # 4 ifadesi eksikti.



Bu sorunu çözmek için harika bir cevap. Çok teşekkür ederim
Hansana Athukorala

7

Localhost / wampserver 3 için bu hatayı kaldırmak için sql-mode = user_mode ayarlayabiliriz:

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

sonra wamp veya apache'yi yeniden başlatın


1
Bunun bu sorun için uzun vadeli bir çözüm olmayabileceğini biliyorum, ama şimdilik yardımcı oldu. Hosting şirketim Go Daddy, MySQL V5.6.33 kullanıyor ve WampServer 3 MySQL V5.7.14 kullanıyor. Bu hızlı çözüm için teşekkürler
Alan N

4

Bir ekleyebilir unique indexiçin group_id; group_idbunun benzersiz olduğundan eminseniz .

Sorgunuzu değiştirmeden durumunuzu çözebilir .

Geç bir cevap, ama cevaplarda henüz bahsedilmedi. Belki zaten mevcut olan kapsamlı cevapları tamamlamalıdır. En azından çok fazla alan içeren bir tabloyu bölmem gerektiğinde davamı çözdü.


2

Doktrin sorgu oluşturucu kullanarak Symfony ile bu hatayla karşılaşırsanız ve bu hata bir orderBy'den kaynaklanıyorsa :

selectİstediğiniz sütuna dikkat edin groupByve aşağıdakiler addGroupByyerine kullanın groupBy:

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

Symfony3 üzerinde çalışıyor -


1

Tam SQL'inizi kullanmadığınız için özür dileriz

Mysql uyarısının üstesinden gelmek için bu sorguyu kullandım.

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

benim için anahtarı not et

count(*) AS cnt
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.