如何使用mySQL进行排序、分组和多重排序

6
这是我表格的简化版本。
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设计,然后按照浏览量排序。


1
如果您有样本数据,那将更加清晰明了。 - Yada
是的,请明确问题。 - Bandi-T
3个回答

3
这是一个在StackOverflow上经常出现的“每组中最大N个值”的问题示例。
这里是我通常的解决方案:
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(),但可能是错误的(您需要定义您希望最新创建的标题具有哪些测量值)。希望能有所帮助。

编辑:已看到您的示例数据并进行了编辑。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接