2009-10-29 2 views
13

Учитывая следующую таблицу 'foo'MySQL GROUP BY поведения

ID | First Name | Last Name 
---------------------------- 
67 John  Smith 
---------------------------- 
67 Bill  Jacobs 

Что first_name и last_name будет следующий обратный запрос и почему?

SELECT * FROM foo WHERE ID = 67 GROUP BY ID 

ответ

0

Очень вероятно, что будут выбраны имя и фамилия второй (последней) строки.

Вы можете добавить предложение ORDER BY, чтобы дать подсказки о том, как отсортировать отсортированные строки.

+2

Нет, MySQL возвращает значения из первой строки в группе. ORDER BY применяется к строкам после формирования групп - это никак не влияет на порядок строк внутри группы. –

+0

Я стою исправлено :) – Charles

4

Группа MySQLs не согласуется со стандартным поведением SQL, MySQL упрощает получение других столбцов, но в то же время u никогда не может быть уверен, какой из них вы получите.

Обновления: см этой страницы: http://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html

При использовании этой функции, все строки в каждой группа должны иметь то же значение для столбцов, которые, совершенных из группы по частям. Сервер является бесплатным , чтобы вернуть любое значение из группы, поэтому результаты неопределены, если все значения совпадают.

0

В стандартном SQL, этот SQL должен потерпеть неудачу, с чем-то ошибкой процессора сервера, как

«FirstName и фамилия не может быть включена в выбранном пункте, если они не находятся также в группе By, или являются частью совокупной функции ".

Действительно ли MySql возвращает данные для этого?

+0

Да, MySQL позволяет это сделать – Greg

3

Не определено, в результате чего вы получите.

Мне всегда было интересно, почему это поведение было даже разрешено. На самом деле, я бы хотел, чтобы такой код просто генерировал ошибку (предпочтительнее, дешифруемый, ни один из этих обычных MySQL «у вашего заявления не проблема, но я не знаю, где».

26

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 является более строгим и запрещает некоторые запросы, которые может быть однозначным - возможно, потому что это было бы слишком сложно для РСУБД, чтобы быть уверенным в общем.

+3

Вы должны получить никольскую премию за этот ответ. – Kermit

0

MySQLs группа по не соответствует стандартному поведению SQL, MySQL позволяет легко получить другие столбцы, но в то же время у никогда не может быть уверен, какой из них и будет получать.

Истина. На самом деле это больше соответствует режиму SELECT DISTINCT ON в postgres, за исключением того, что это позволяет вам указать порядок строк до выделения (?) И, следовательно, какую строку вы получите (т.е. самую последнюю, самую старшую, любую).

Примечание. MySQL в режиме «sql compliant» отклонит GROUP BY с не определенными столбцами, как в вашем примере.

 Смежные вопросы

  • Нет связанных вопросов^_^