Skip to content

MySQL ONLY_FULL_GROUP_BY Hatası: Hızlı Çözüm

Published: at 10:00 AMSuggest an edit

Selam! MySQL’de şu hatayı alıyor musunuz?

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column...

Bu ONLY_FULL_GROUP_BY yüzünden. MySQL 5.7’den itibaren default olarak açık geliyor ve GROUP BY kullanırken SELECT’teki her column’ın ya GROUP BY’da olmasını ya da aggregate function (SUM, COUNT, MAX vs.) içinde olmasını istiyor.

Problem Nedir?

Eskiden şöyle yazabiliyorduk:

-- This worked in MySQL 5.6
SELECT user_id, name, COUNT(*)
FROM orders
GROUP BY user_id;

Artık hata veriyor çünkü name GROUP BY’da yok!

Hızlı Çözüm

Geçici kapatma:

-- Disable for current session
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Kalıcı kapatma:

-- Check current mode
SELECT @@sql_mode;

-- Disable globally
SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

Config dosyasından:

# /etc/mysql/my.cnf
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Doğru Yaklaşım

Aslında ONLY_FULL_GROUP_BY iyi bir şey! SQL standardına uygun. Kapatmak yerine query’nizi düzeltin:

-- Correct way
SELECT user_id, MAX(name) as name, COUNT(*) as total
FROM orders
GROUP BY user_id;

-- Or use ANY_VALUE() for non-aggregated columns
SELECT user_id, ANY_VALUE(name) as name, COUNT(*)
FROM orders
GROUP BY user_id;

Neden Önemli?

ONLY_FULL_GROUP_BY kapalıyken MySQL rastgele değer seçiyor. Hangi name’i alacağı belirsiz! Bu tutarsız sonuçlara yol açabilir.

Production’da kapatmayın, query’lerinizi düzeltin! Development’ta geçici kapatabilirsiniz ama kalıcı çözüm doğru SQL yazmak.

Hepsi bu kadar! MySQL’in bu “strict” davranışı başta sinir bozucu olsa da, aslında daha güvenli kod yazmanızı sağlıyor.



Previous Post
Daemon Nedir? Arka Planda Çalışan Güçlü Yardımcılar
Next Post
Dart Enums: Type Safety'nin Küçük Kahramanları