SELECT * FROM my_table GROUP BY section_identifier
е невалиден SQL
заявка.
Как GROUP BY
работи?
Нека получим заявката по-горе и да видим как GROUP BY
върши работа. Първо машината на базата данни избира всички редове, които съответстват на WHERE
клауза. Няма КЪДЕ
клауза в тази заявка; това означава, че всички редове на таблицата се използват за генериране на набора от резултати.
След това групира редовете, използвайки изразите, посочени в GROUP BY
клауза:
+----+--------------------+----------------------+----------+
| id | section_identifier | option_identifier | store_id |
+----+--------------------+----------------------+----------+
| 17 | header | header_option_one | 1 |
| 23 | header | header_option_three | 0 |
+----+--------------------+----------------------+----------+
| 18 | footer | footer_option_one | 0 |
+----+--------------------+----------------------+----------+
| 19 | homepage_feature | homepage_feature_one | 0 |
| 25 | homepage_feature | homepage_feature_one | 1 |
+----+--------------------+----------------------+----------+
Маркирах групите в списъка по-горе, за да стане всичко ясно.
На следващата стъпка от всяка група машината на базата данни произвежда един ред . Но как?
SELECT
клаузата на вашата заявка е SELECT *
. *
означава пълния списък с колони на таблицата; в този случай, SELECT *
е кратък начин за писане:
SELECT id, section_identifier, option_identifier, store_id
Нека анализираме стойностите на колона id
за първата група. Каква стойност трябва да избере машината на базата данни за id
? 17
или 23
? Защо 17
и защо 23
?
Той няма критерии за предпочитане на 17
над 23
. То просто избира един от тях (вероятно 17
но това зависи от много вътрешни фактори) и е едно.
Няма проблем да се определи стойността за section_identifier
. Това е колоната, използвана за GROUP BY
, всичките му стойности в група са равни.
Дилемата при избора се появява отново в колони option_identifier
и store_id
.
Според стандартния SQL
вашата заявка не е валидна и не може да бъде изпълнена. Въпреки това, някои машини за бази данни го изпълняват, както е описано по-горе. Стойностите за изрази, които не са (поне един от изброените по-долу):
- използва се в
GROUP BY
клауза; - използва се с
GROUP BYкод> агрегатни функции
вSELECT
клауза; - функционално зависи от колоните, използвани в
GROUP BY
клауза;
са неопределени.
От версия 5.7.5
, MySQL
прилага функционално откриване на зависимости
и по подразбиране отхвърля невалиден GROUP BY
заявка като твоята.
Как да го накарам да работи
Не ми е ясно как искате да получите набора от резултати. Както и да е, ако искате да получите някои редове от таблицата, тогава GROUP BY
не е правилният начин да го направите. ГРУПА ПО
не изберете редове от таблица, той генерира нови стойности, използвайки стойностите от таблицата. Ред, генериран от GROUP BY
, в повечето случаи не съответства на нито един ред от таблицата източник.
Можете да намерите възможно решение на проблема си в този отговор . Ще трябва да напишете заявката сами, след като прочетете и разберете идеята (и ви е много ясно как трябва да бъдат избрани редовете за „победител“).