Serhatt Olayı anlamaya çalışalım. Bir takımda farklı sınıflardan öğrenciler var diyelim ve siz bunları sınıflara göre gruplayıp takımda her sınıftan kaç öğrenci var almak istiyorsunuz. Sorguyu yazdınız:
SELECT class_name,
count(*) AS students_count
FROM teams
WHERE id = 1
GROUP BY class_name
+------------+----------------+
| class_name | students_count |
+------------+----------------+
| A | 5 |
| B | 11 |
| C | 9 |
+------------+----------------+
Sorun yok. Şimdi siz buraya öğrenci adını da eklerseniz:
SELECT class_name,
count(*) AS students_count,
name
FROM teams
WHERE id = 1
GROUP BY class_name
teams.name isn't in group by
şeklinde aynı hatayı alırsınız çünkü burada veritabanı oraya ne getireceğini bilmiyor. Mesela A sınıfında 5 öğrenci gelmiş ama sadece birinin adını koyabilir. O yüzden sizden name alanını teke indirmek için ya aggregation'a tabi tutmanızı isteyecek (count, min, max, sum, avg...) ya da group by içine koymanızı isteyecek. Name alanına aggregation uygulayamazsınız (mantıksız, en fazla min/max ile sıralarsınız), group by içine koyarsanız da bu sefer isimleri göre de gruplama yapacağı için farklı bir sonuç alırsınız. Mesela kimsenin adı aynı değilse takımdaki öğrenci sayısı kadar kayıt gelir ve students_count değeri hepsinde 1 olur çünkü o sınıfta aynı isimden sadece 1 öğrenci var.
Çözüm için strict false dediniz ve ONLY_FULL_GROUP_BY özelliğini iptal ettiniz. Hata vermez ama size şöyle bir sonuç verir:
+------------+----------------+-----------------+
| class_name | students_count | name |
+------------+----------------+-----------------+
| A | 5 | Zeynep Demir |
| B | 11 | Ahmet Unutkan |
| C | 9 | Şule Çelikdöver |
+------------+----------------+-----------------+
MySQL burada name alanını natural order dediğimiz kayıtların eklenme sırasına göre getirir. Tamam sorgu çalıştı ama name alanı ne alaka, Zeynep Demir sizin ne işinize yarayacak, aynı sınıftaki diğer 4 öğrenciden ne farkı var, gerçekten istediğiniz isim o mu, neye göre o?
Bu şekilde bir durum söz konusu...