Mysql
 sql >> база данни >  >> RDS >> Mysql

Как GROUP BY DESC избира своята поръчка?

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 , в повечето случаи не съответства на нито един ред от таблицата източник.

Можете да намерите възможно решение на проблема си в този отговор . Ще трябва да напишете заявката сами, след като прочетете и разберете идеята (и ви е много ясно как трябва да бъдат избрани редовете за „победител“).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. как да намеря първия и последния запис от таблицата на mysql

  2. MySQL:Уникално ограничение за множество полета

  3. jdbc към MYSQL грешка:Не е намерен подходящ драйвер за jdbc:mysql://localhost:3306/test?user='root'&password=''

  4. MySQLdb Python вмъкнете %d и %s

  5. SQL заявка за изчисляване на баланса по сметката