2013-03-13 7 views
14

У меня есть следующая таблица называется вопросы:Как группировать по DESC заказа

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 

Так выбирает первый 'Боб' он встречает вместо из последнего.

Благодаря

+0

Вопрос: Является ли ваш столбец ID как INTERGERS или VARCHAR? –

+0

auto increment integer –

ответ

25

Если вы хотите последнюю 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 to GROUP BY)

С MySQL Docs:

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

+0

Не работает со мной – itsazzad

+0

@itsazzad Что значит «не работает для меня»? Это не самое описательное объяснение проблемы. – Taryn

+2

, если я использую 'SELECT *, max (id) как id', то его не дает правильный результат – itsazzad

2

Записи должны быть сгруппированы с помощью GROUP BY и MAX(), чтобы получить максимальный идентификатор для каждого asker.

SELECT asker, MAX(ID) ID 
FROM TableName 
GROUP BY asker 

ВЫВОД

╔════════╦════╗ 
║ ASKER ║ ID ║ 
╠════════╬════╣ 
║ Bob ║ 2 ║ 
║ Marley ║ 3 ║ 
╚════════╩════╝ 
+0

Как вы можете получить максимальный id для каждого идентификатора? – fungusanthrax

1

Другие верны в использовании MAX (ID) для получения желаемых результатов. Если вам интересно, почему ваш запрос не работает, это потому, что ORDER BY происходит послеGROUP BY.

15

Обычно MySQL допускает группировку только по возрастанию. Поэтому мы можем заказать записи перед группировкой.

 
SELECT * 
FROM (
    SELECT * 
    FROM questions 
    ORDER BY id DESC 
) AS questions 
GROUP BY questions.asker 
0

Чтобы получить каждый столбец:

SELECT * FROM questions 
WHERE id IN 
(SELECT max(id) as id, asker 
FROM questions 
GROUP by asker 
ORDER by id DESC) 

Улучшенная версия ответа @bluefeet.

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