2

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

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 查询中翻译它?

4

2 回答 2

12
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

或者

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
于 2013-02-22T16:33:11.557 回答
3

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

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

请参阅带有演示的 SQL Fiddle

于 2013-02-22T16:35:53.910 回答