MySQL |如何只选择每个类别的一条记录?

时间:2013-02-22 16:32:00

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

我有一个包含数据记录的表,每个记录都属于一个类别。假设我有以下表格:

ID | Category | Title    | Date
--------------------------------------
1  | Cat 1    | Ttl 1    | 2013-02-18
2  | Cat 2    | Ttl 2    | 2013-02-18
3  | Cat 1    | Ttl 3    | 2013-02-20

我喜欢做的是,每个类别只能获得一篇文章,而我将获得的文章必须是表格中的最新文章。

更深入地说,结果必须如下:

ID | Category | Title    | Date
--------------------------------------
2  | Cat 2    | Ttl 2    | 2013-02-18
3  | Cat 1    | Ttl 3    | 2013-02-20

正如你所看到的,每个类别只有一个记录(一个用于Cat 1,一个用于Cat 2),在Cat 1的记录中我有最新记录。

如何在MySQL查询中翻译?

2 个答案:

答案 0 :(得分:11)

SELECT  a.*
FROM    tableName a
        INNER JOIN
        (
            SELECT Category, MAX(date) max_date
            FROM    tableName
            GROUP BY Category
        ) b ON a.category = b.category AND
                a.date = b.max_date

为了获得更好的效果,请在列INDEX

上添加化合物Category, date

OR

SELECT  a.*
FROM    tableName a
        INNER JOIN
        (
            SELECT Category, MAX(ID) max_ID
            FROM    tableName
            GROUP BY Category
        ) b ON a.category = b.category AND
                a.ID = b.max_ID

答案 1 :(得分:3)

您可以使用WHERE子句过滤数据:

select *
from yourtable t1
where (category, date) in (select category, max(date)
                           from yourtable t2
                           group by category)

请参阅SQL Fiddle with Demo