2012-01-04 1 views
2

У меня проблема с моим запросом GROUP BY (самый сложный из них, по крайней мере, для меня).GROUP BY - сортировка до и после группировки

Что я хочу сделать, это получить последние измененные записи, сгруппированные по другому столбцу. Проблема в том, что группировка возвращает единственную первую найденную ею запись (в группе) без учета ORDER BY (кроме случаев, когда возвращается окончательный результат).

Вот упрощенная версия моего кода.

SELECT events.id, events.name, events.type, events.modified_time 
FROM events 
GROUP BY events.type 
ORDER BY event.modified_time DESC 

который будет возвращать:

1 | Event One | Birthday | Jan 1, 2012 
2 | Event Two | Graduation | Jan 1, 2012 

Когда на самом деле есть третья запись с измененным временем, которое позже:

3 | Event Three | Birthday | Jan 2, 2012 

Я попытался с помощью предложения HAVING из MAX (modified_time), но он также не возвращает правильные результаты. Возможно, мне просто нужно обсудить это с кем-то, кто хорошо осведомлен, но если вопрос имеет достаточный смысл, и вы можете сказать, что мне нужно, тогда, возможно, есть простой ответ.

БОНУС ВОПРОС:
Можно ли сделать это без подзаголовка?

+0

Не можете ли вы добавить 'events.modified_time' в предложение GROUP BY? –

+0

@Lieven Тогда я получу 3 записи, когда я действительно хочу 2 последних. – Matthew

+3

ORDER BY не повлияет на GROUP BY, если хотите, а скорее только на окончательную сортировку. –

ответ

1

Это, среди многих других методов, может работать для вас:

SELECT a.id, a.name, a.[type], a.modified_time 
FROM [events] AS a 
    JOIN (
     SELECT MAX([events].id) AS id, [events].[type] 
     FROM [events] 
     GROUP BY [events].[type]  
    ) AS b ON a.id = b.id AND a.[type] = b.[type] 
ORDER BY a.modified_time DESC 
+0

Вы предполагаете, что идентификатор большего размера всегда соответствует более позднему измененному времени. – kurosch

+0

Вы предполагаете, что тип и modified_time являются уникальным ключом. –

+0

lol ... связанное решение, которое у меня есть, показывает и наоборот. Мы посмотрим, чего хочет OP, я думаю! –

1

GROUP BY/HAVING не то, что вы хотите. То, что вы хотите, или:

WHERE 
    events.modified_time = (select max(modified_time) from events e2 where e2.type = events.type) 

... или же решение, как Тим связан с использованием аналитической функции как ROW_NUMBER

+0

Обратите внимание, что если у вас несколько событий одного и того же типа с таким же измененным временем, такое состояние вернет их все. – kurosch

+1

AFAIK, MySQL не имеет аналогичной концепции, такой как ROW_NUMBER SQL Server. –

+1

Обратите внимание, что 'ROW_NUMBER' не существует в MySQL. –