如何使用mySQL订购,分组和订购

时间:2010-01-22 19:01:09

标签: mysql group-by greatest-n-per-group

这是我的表格的简化版本

tbl_records
-title
-created
-views

我想知道如何根据标题对查询进行分组,但是为每个组返回的记录是最近创建的。然后我会按意见订购。

我猜测的一种方法是做一个子查询并按创建顺序排序,然后按标题对其进行分组,然后从这些结果按视图排序。我想有更好的方法。

由于

修改

示例数据:

-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设计,然后按视图排序结果。

3 个答案:

答案 0 :(得分:3)

这是StackOverflow上经常出现的greatest-n-per-group问题的示例。

这是我通常的解决方案:

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 :(得分: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(),但可能是错误的(您需要有一些方法来定义您希望拥有哪种视图度量为最新创建的标题)。希望有所帮助。

编辑:看过你的样本数据并进行相应的编辑。

答案 2 :(得分:0)

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