即使它们是NULL,也可以通过`updated_at`和`created_at`排序

时间:2013-03-19 13:47:56

标签: mysql sql sql-order-by

我有下表:

CREATE TABLE `entries` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

我想按updated_atcreated_at对这些条目进行排序。

但其中任何一个都可能是NULL

我的查询:

SELECT *
FROM `entries`
ORDER BY `updated_at` DESC, `created_at` DESC, `id` DESC

但是这会将结果底部未更新的每个条目都放在其中。

基本上我需要按照可用的最后日期对它们进行排序。如果没有可用的id排序。

4 个答案:

答案 0 :(得分:3)

我相信你想要的是:

ORDER BY coalesce(updated_at, created_at) DESC, id DESC

按订单更新日期(如果有)或创建日期(如果不可用)。然后它按id降序排序。

答案 1 :(得分:1)

您可以使用CASE语句。

SELECT *
FROM `entries`
ORDER BY CASE WHEN `updated_at` IS NOT NULL then `updated_at` WHEN `created_at` IS NOT NULL then `created_at` ELSE `id` END DESC

答案 2 :(得分:0)

也许尝试COALESCE

SELECT *
FROM `entries`
ORDER BY COALESCE(updated_at, created_at, id) DESC

这不一定完全你所要求的,但它可能会进入你想要的方向。如果它不对,你能发布一个你想要的例子吗?

答案 3 :(得分:0)

我并不完全明白你想要什么,但你可以试试这个:

SELECT *
FROM `entries`
ORDER BY IFNULL(`updated_at`,`created_at`) DESC, `id` DESC

如果其中一个日期可用,结果将按日期排序。 如果没有可用日期,则结果将按ID排序。

注意:您的DBMS不一定提供IFNULL,但您可以找到等效的。