Mysql 获得最新记录

Mysql 获得最新记录,mysql,sql,select,where,Mysql,Sql,Select,Where,我想根据日期字段选择表中最新的行 最晚的日期应该被删除。然而,问题是,如果日期为空,则应优先于任何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

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

最晚的日期应该被删除。然而,问题是,如果日期为空,则应优先于任何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
如果我有两行,如下所示,则此操作有效:

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
它应该拉出结束日期为“2015-06-02”的行,它正确地执行了该操作

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

id    end_date
 1    2014-06-02
 2    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, 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\u date)
的同时,此查询对空值的数量求和
isnull
如果结束日期为null,则返回1;如果不为null,则返回0。因此,如果我们对这些int求和,结果应该是id在结束日期的null数


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

COALESCE(end_date,'9999-00-00')或类似的内容that@Strawberry差不多,但它返回第一个非NULL值,如下所示:“返回列表中的第一个非NULL值,如果没有非NULL值,则返回NULL。”我需要它返回第一个空值,否则返回最大值。谢谢你的建议。每个id只有一个
null
值吗?或者您是否有多个(您将如何选择)?您是将null计算为“hival”行,还是仅在没有其他值时才返回该行?