furkay16 Şöyle bir tablo düşünün:
+----+---------+------+
| id | col1 | col2 |
+----+---------+------+
| 1 | Laravel | 5 |
| 2 | Laravel | 6 |
| 3 | Symfony | 2 |
| 4 | Gin | 8 |
+----+---------+------+
col1 alanına göre group by yaptınız diyelim. SQL size daima tek satırda tek sütun değeri verir. Aynı anda iki değer vermesi mümkün değil. Bu durumda Laravel değerine karşılık iki tane değer geliyor; 5 ve 6. Şimdi sütunda sadece birini gösterebilirsiz. Bu durumda aggregation yapmanız lazım. Yani ya MAX(col2) deyip 6 yı alacaksınız ya MIN(col2) deyip 5'i alacaksınız ya da SUM(col2) yapıp 11 değerini alacaksınız ya da 5,6 şeklinde string olarak birleştireceksiniz vs... işte diğer aggregation ya da diğer yöntemleri kullanarak o değeri tek sütuna indirgemeniz lazım. Gruplamanın temel mantığı bu.
select col1, max(col2) as col2 from table group by col1;
+---------+------+
| col1 | col2 |
+---------+------+
| Laravel | 6 |
| Symfony | 2 |
| Gin | 8 |
+---------+------+
Şimdi 10 sütun var ve siparisno ile gruplamak istiyorsunuz ama diğer sütunları da istiyorsunuz. Diğer sütunlar aynı değere sahip değil ise, hepsi farklı farklı ise hangisini getirecek? Olay bu. Bu durumda iki seçenek oluyor: Ya diğer sütunları da group by içine alacaksınız ya da aggregation yapıp select içinde belirteceksiniz. Veriyi bir şekilde sıkıştırıp tek satırdaki tüm sütunları tek bir değere indirgemeniz lazım.
MySQL alanları belirtmeden yapmanıza izin veriyor, ini ayarlarına bir direktif ekleyerek yapılabiliyorsunuz ama istediğiniz sonucu vermesinin garantisi yok çünkü birden fazla değer olunca sıraya göre ilk olanı getiriyor, sizin istediğiniz o olmayabilir...