获取最新记录

时间:2014-07-14 06:47:51

标签: mysql sql select where

我想根据日期字段选择表格中的最新行。

应该取消最新日期。但是,如果日期为NULL,则应该优先于任何max(end_date)。

我最接近的是以下内容:

SELECT id, status_id
FROM
contacts AS cc
INNER JOIN
statuses AS s ON (s.id = cc.id)
INNER JOIN (
    SELECT id, max(end_date) as max_end_date FROM statuses
    GROUP BY id 
) s2 ON s2.max_end_date = s.end_date AND s2.id = s.id

如果我有两行,如下所示:

id     end_date
 1     2014-06-02
 2     2015-06-02

它应该使用end_date" 2015-06-02" - 它正确地做了。

但是,如果行如下所示它不起作用:

id    end_date
 1    2014-06-02
 2    NULL

它应该返回结束日期为NULL的行。

任何帮助都将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

因此,您要问的问题是,您正在尝试查看该表是否具有空值以及max(end_date)是什么。这些本质上是两个非常不同的问题。这些问题通常以非常不同的方式解决,因为找到一个问题的效率与找到另一个问题的效率不同。

我通常使用的方法基本上不在表中,因为它们会在同一个表上添加另一个内连接。这对提高效率并不是很好。相反,我认为这个查询将满足您的需求:

SELECT id, status_id
FROM
contacts AS cc
INNER JOIN
statuses AS s ON (s.id = cc.id)
INNER JOIN (
    SELECT id, max(end_date) as max_end_date, sum(isnull(end_date)) as nullcount
    FROM statuses
    GROUP BY id 
) s2 ON case when nullcount > 0
        Then null
        else s2.max_end_date end = s.end_date
     AND s2.id = s.id

这个查询很奇怪,但它可以让你弄清楚是否有空值。在我们找到max(end_date)的同时,此查询将空值的数量相加。如果end_date为null,isnull将返回1,如果它不为null,则返回0,因此如果我们对这些int求和,则结果应该是id对end_date的空值数。

然后,连接条件是一个case语句。如果空值的数量大于0,我们将使用null作为end_date值。否则,我们将使用子查询返回的最大值。