15/05/2018 - MYSQL
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.
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 |
+----+-----------+---------+-------+--------------+------+
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 |
+----+-----------+---------+-------+------+
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;