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 - единственная другая СУБД, которая допускает неоднозначные столбцы в сгруппированном запросе. 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 получает свою собственную группу, если мы GROUP BY по первичному ключу foo. Таким образом, любой столбец из foo может иметь только одно значение в группе. Даже присоединение к другой таблице, на которую ссылается внешний ключ в foo, может иметь только одно значение на группу, если группы определены первичным ключом foo.
MySQL и SQLite доверяют вам создавать логически однозначные запросы. Формально каждый столбец в списке выбора должен быть функциональной зависимостью столбцов в критериях GROUP BY. Если вы не придерживаетесь этого, это ваша вина. : -)
Стандартный SQL является более строгим и запрещает некоторые запросы, которые могли бы быть однозначными - возможно, потому что это было бы слишком сложно для СУБД, чтобы быть уверенным в целом.