如果日期相同,则从具有最大日期和最大ID的表中选择id

时间:2015-01-27 18:15:56

标签: mysql

举个例子,我有MySQL表:

id  category  date        value
1   a         2013-01-02  7
2   a         2013-01-01  2
3   a         2013-01-01  3
4   b         2013-01-01  1
5   b         2013-01-02  4
6   b         2013-01-03  5
7   c         2013-01-03  4
8   c         2013-01-03  8

我需要为每个类别选择MAX(日期)的记录,但如果日期相同,则使用MAX(id)。 因此,预期结果必须是:

id  category  date        value
1   a         2013-01-02  7
6   b         2013-01-03  5
8   c         2013-01-03  8

如您所见,相同类别的日期可能无法排序(例如id = 4,5)。

我试过像:

这样的查询
SELECT * FROM mytable t1
INNER JOIN 
(
   SELECT category, MAX(date) AS MAXDATE
   FROM mytable
   GROUP BY category
) t2
ON t1.category = t2.category
AND t1.date = t2.MAXDATE

当我们在表格中没有相同的日期时,它工作正常。但对于我的情况,它将返回具有最低ID的记录:

   id  category  date        value
    1   a         2013-01-01  7
    6   b         2013-01-03  5
    7   c         2013-01-03  4

1 个答案:

答案 0 :(得分:1)

您走在正确的轨道上,但您需要更改您的加入。 我想你想要的是以下内容:

SELECT * FROM mytable t1
INNER JOIN 
(
   SELECT MAX(id) AS ID, MAX(date) AS MAXDATE
   FROM mytable
   GROUP BY category
) t2
ON t1.id = t2.ID
AND t1.date = t2.MAXDATE

如前所述,以前的用法不适用于每个用例。以下可能。

SELECT a.*
FROM mytable AS a,
(
    SELECT category, date, MAX(id) AS ID
    FROM mytable
    GROUP BY category, date
) AS b,
(
    SELECT category, MAX(date) AS date
    FROM mytable
    GROUP BY category
) AS c
WHERE b.category = c.category
AND b.date = c.date
AND a.id = b.id