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()
, ,
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 является более строгим и запрещает некоторые запросы, которые может быть однозначным - возможно, потому что это было бы слишком сложно для РСУБД, чтобы быть уверенным в общем.
Нет, MySQL возвращает значения из первой строки в группе. ORDER BY применяется к строкам после формирования групп - это никак не влияет на порядок строк внутри группы. –
Я стою исправлено :) – Charles