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 , в повечето случаи не съответства на нито един ред от таблицата източник.
Можете да намерите възможно решение на проблема си в този отговор . Ще трябва да напишете заявката сами, след като прочетете и разберете идеята (и ви е много ясно как трябва да бъдат избрани редовете за „победител“).