Как заказать, сгруппировать, заказать с MySQL - PullRequest
6 голосов
/ 22 января 2010

Вот упрощенная версия моей таблицы

tbl_records
-title
-created
-views

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

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

Спасибо

EDIT:

ОБРАЗЦЫ ДАННЫХ:

-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

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

Ответы [ 3 ]

3 голосов
/ 23 января 2010

Это пример проблемы 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 голос
/ 22 января 2010
 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(), но вполне может быть ошибочным (вам нужно будет каким-то образом определить, какую меру просмотров вы хотите получить для последних созданных заглавие). Надеюсь, это поможет.

РЕДАКТИРОВАТЬ : просмотрел данные вашего образца и отредактировал их соответственно.

0 голосов
/ 22 января 2010
SELECT title, 
       MAX(created), 
       views 
FROM table 
GROUP BY title 
ORDER BY views DESC
...