MySQL избира ред произволно. На практика често използваните системи за съхранение на MySQL връщат стойностите от първия ред в групата по отношение на физическото съхранение.
create table foo (id serial primary key, category varchar(10));
insert into foo (category) values
('foo'), ('foo'), ('foo'), ('bar'), ('bar'), ('bar');
select * from foo group by category;
+----+----------+
| id | category |
+----+----------+
| 4 | bar |
| 1 | foo |
+----+----------+
Други хора са прави, че MySQL ви позволява да стартирате тази заявка, въпреки че има произволни и потенциално подвеждащи резултати. SQL стандартът и повечето други доставчици на RDBMS забраняват този вид двусмислени заявки GROUP BY. Това се нарича Правило за една стойност :всички колони в списъка за избор трябва да бъдат изрично част от критериите GROUP BY, или в друга част от агрегатна функция, напр. COUNT()
, MAX()
и др.
MySQL поддържа SQL режим ONLY_FULL_GROUP_BY
което кара MySQL да връща грешка, ако се опитате да изпълните заявка, която нарушава стандартната семантика на SQL.
AFAIK, SQLite е единствената друга RDBMS, която позволява двусмислени колони в групирана заявка. SQLite връща стойности от последния ред в групата:
select * from foo group by category;
6|bar
3|foo
Можем да си представим заявки, които не биха били двусмислени, но все пак нарушават стандартната семантика на SQL.
SELECT foo.*, parent_of_foo.*
FROM foo JOIN parent_of_foo
ON (foo.parent_id = parent_of_foo.parent_id)
GROUP BY foo_id;
Няма логичен начин това да доведе до двусмислени резултати. Всеки ред в foo получава своя собствена група, ако ГРУПИРАМЕ по първичния ключ на foo. Така че всяка колона от foo може да има само една стойност в групата. Дори присъединяването към друга таблица, посочена от външен ключ в foo, може да има само една стойност на група, ако групите са дефинирани от първичния ключ на foo.
MySQL и SQLite ви се доверяват да проектирате логически недвусмислени заявки. Формално всяка колона в списъка за избор трябва да е функционална зависимост от колоните в критериите GROUP BY. Ако не се придържате към това, вината е ваша. :-)
Стандартният SQL е по-строг и забранява някои заявки, които могат бъдете недвусмислени - вероятно защото би било твърде сложно за RDBMS, за да бъде сигурна като цяло.