2010-01-22 1 views
6

Вот упрощенная версия моего столаКак сделать заказ, группа, заказать с MySql

tbl_records 
-title 
-created 
-views 

Мне интересно, как я могу сделать запрос, где они сгруппированы по названию, но запись, которая возвращается для каждая группа является самой последней созданной. Затем я закажу его по просмотрам.

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

Благодаря

EDIT:

SAMPLE DATA:

-title: Gnu Design 
-created: 2009-11-11 14:47:18 
-views: 104 

-title: Gnu Design 
-created:2010-01-01 21:37:09 
-views:9 

-title: French Connection 
-created:2010-05-01 09:27:19 
-views:20 

Я хотел бы, чтобы результаты были:

-title: French Connection 
-created:2010-05-01 09:27:19 
-views:20 

-title: Gnu Design 
-created:2010-01-01 21:37:09 
-views:9 

Только самые recen t Отображается Gnu Design, после чего результаты упорядочиваются по точкам.

+1

Если у вас есть образцы данных, было бы намного понятнее. – Yada

+0

Да, пожалуйста, уточните вопрос. –

ответ

3

Это пример greatest-n-per-group проблема, которая часто появляется на StackOverflow.

Вот мое обычное решение:

SELECT t1.* 
FROM tbl_records t1 
LEFT OUTER JOIN tbl_records t2 ON (t1.title = t2.title AND 
    (t1.created < t2.created OR t1.created = t2.created AND t1.primarykey < t2.primarykey)) 
WHERE t2.title IS NULL; 

Объяснение: найти строку t1, для которых ни одна другая строка t2 не существует с тем же title и более created дату. В случае связей используйте уникальный ключ для разрешения галстука, если не получится получить несколько строк за title.

1
select i.*, o.views from 
    (
     select 
     title 
     , max(created) as last_created 
     from tbl_records 
     group by title 
    ) i inner join tbl_records o 
    on i.title = o.title and i.last_created = o.created 
    order by o.views desc 

Я предполагаю, что агрегация для применения к views является count(), но вполне может быть неправильным (вы должны иметь какой-то способ определения того, какие меры взглядов вы хотите иметь для Lastest создан заглавие). Надеюсь, это поможет.

EDIT: просмотрели ваши данные образца и отредактировали соответственно.

0
SELECT title, 
     MAX(created), 
     views 
FROM table 
GROUP BY title 
ORDER BY views DESC