У меня есть следующая таблица:
ID | asker 1 | Bob 2 | Bob 3 | Marley
Я хочу, чтобы каждый выборчик выбирал только один раз, и если есть несколько запросов с тем же именем, выберите один из самых высоких идентификаторов. Итак, ожидаемые результаты:
ID | asker 3 | Marley 2 | Bob
Я использую следующий запрос:
SELECT * FROM questions GROUP by questions.asker ORDER by questions.id DESC
Я получаю следующий результат:
ID | asker 3 | Marley 1 | Bob
Таким образом, он выбирает первый «Боб», с которым он сталкивается, вместо последнего.
благодаря
Если вам нужен последний id
для каждого asker
, то вы должны использовать агрегатную функцию:
SELECT max(id) as id, asker FROM questions GROUP by asker ORDER by id DESC
Причина, по которой вы получали необычный результат, заключается в том, что MySQL использует расширение для GROUP BY
которое позволяет элементам в списке выбора быть неагрегированными и не включаться в предложение GROUP BY. Однако это может привести к неожиданным результатам, поскольку MySQL может выбирать возвращаемые значения. (См. MySQL Extensions для GROUP BY )
Из документов MySQL:
MySQL расширяет использование GROUP BY, чтобы список выбора мог ссылаться на неагрегированные столбцы, не названные в предложении GROUP BY. … Вы можете использовать эту функцию для повышения производительности, избегая ненужной сортировки и группировки столбцов. Однако это полезно, прежде всего, когда все значения в каждом неагрегированном столбце, не названном в GROUP BY, одинаковы для каждой группы. Сервер может выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными. Более того, выбор значений из каждой группы не может зависеть от добавления предложения ORDER BY. Сортировка набора результатов происходит после того, как были выбраны значения, и ORDER BY не влияет на значения, которые выбирает сервер.
Обычно MySQL позволяет группировать только записи по возрастанию. Поэтому мы можем заказать записи перед группировкой.
ВЫБРАТЬ * ИЗ ( ВЫБРАТЬ * ОТ вопросов ORDER BY id DESC ) Вопросы AS GROUP BY questions.asker
Записи должны быть сгруппированы с использованием GROUP BY
и MAX()
чтобы получить максимальный идентификатор для каждого asker
.
SELECT asker, MAX(ID) ID FROM TableName GROUP BY asker
ВЫВОД
╔════════╦════╗ ║ ASKER ║ ID ║ ╠════════╬════╣ ║ Bob ║ 2 ║ ║ Marley ║ 3 ║ ╚════════╩════╝
Другие правильны в использовании MAX (ID) для получения желаемых результатов. Если вам интересно, почему ваш запрос не работает, это потому, что ORDER BY
происходит после GROUP BY
.
Чтобы получить каждый столбец:
SELECT * FROM questions WHERE id IN (SELECT max(id) as id, asker FROM questions GROUP by asker ORDER by id DESC)
Улучшена версия ответа @bluefeet.