MySQL 5.7 ve sonraki sürümler, daha önce varsayılan olarak devre dışı bırakılmış olan ONLY_FULL_GROUP_BY özelliğini etkinleştirir. SQL sorgularınızda GROUP BY deyimini kullanırsanız, büyük olasılıkla aşağıdakine benzer bir uyarı iletisi alırsınız.


[42000][1055] Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Uyarıdan kurtulmak için ONLY_FULL_GROUP_BY özelliğini devre dışı bırakabilirsiniz. Şahsen bunu tavsiye etmem çünkü bu özellik iyi niyetli olarak eklenmiştir. Onun yerine bu örnekte, sorgunuzu nasıl yapılandırmanız gerektiğini göreceğiz.


Veritabanı


mysql> DESCRIBE fruit;
+--------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| origin | varchar(100) | YES | | NULL | |
| price | double | YES | | NULL | |
| is_available | int(1) | YES | | NULL | |
| year | varchar(4) | YES | | NULL | |
+--------------+------------------+------+-----+---------+----------------+

mysql> SELECT * FROM fruit;
+----+-----------+---------+-------+--------------+------+
| id | name | origin | price | is_available | year |
+----+-----------+---------+-------+--------------+------+
| 1 | Apple | Germany | 1.99 | 1 | 2018 |
| 2 | Banana | Jamaica | 2.01 | 1 | 2018 |
| 3 | Orange | Germany | 1.88 | 1 | 2017 |
| 4 | Cherry | Spain | 2.04 | 0 | 2017 |
| 5 | Melon | Spain | 2.77 | 1 | 2018 |
| 6 | Pear | France | 0.99 | 0 | 2018 |
| 7 | Plum | Turkey | 2.11 | 1 | 2018 |
| 8 | Peach | Turkey | 2.23 | 0 | 2017 |
| 9 | Pineapple | Kenya | 3.01 | 1 | 2018 |
| 10 | Banana | Denmark | 2.44 | 1 | 2019 |
+----+-----------+---------+-------+--------------+------+

Amacımız ve beklentimiz


Birden fazla alan seçip, tek alan üzerinden gruplandırıp, sonuçları birden fazla alan üzerinden sıralayacağız. Beklediğimiz sonuç aşağıdaki gibidir.


+----+-----------+---------+-------+------+
| id | name | origin | price | year |
+----+-----------+---------+-------+------+
| 10 | Banana | Denmark | 2.44 | 2019 |
| 1 | Apple | Germany | 1.99 | 2018 |
| 2 | Banana | Jamaica | 2.01 | 2018 |
| 5 | Melon | Spain | 2.77 | 2018 |
| 9 | Pineapple | Kenya | 3.01 | 2018 |
| 7 | Plum | Turkey | 2.11 | 2018 |
+----+-----------+---------+-------+------+

Sorgu


Buradaki kritik nokta ANY_VALUE fonksiyonunun kullanılmasıdır. Bununla birlikte AVG(), MIN(), MAX() ve GROUP_CONCAT gibi fonksiyonlarıda kullanabilirsiniz.


mysql> SELECT
-> ANY_VALUE(`id`) AS `id`,
-> ANY_VALUE(`name`) AS `name`,
-> `origin`,
-> ANY_VALUE(`price`) AS `price`,
-> ANY_VALUE(`year`) AS `year`
-> FROM `fruit`
-> WHERE `is_available` = 1
-> GROUP BY `origin`
-> ORDER BY `year` DESC, `name` ASC;