Mysql 按“updated_at”和“created_at”排序,即使它们为空

Mysql 按“updated_at”和“created_at”排序,即使它们为空,mysql,sql,sql-order-by,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 CHARS

我有下表:

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_和
上的
created_对条目进行排序

但它们中的任何一个都可以是
NULL

我的问题是:

SELECT *
FROM `entries`
ORDER BY `updated_at` DESC, `created_at` DESC, `id` DESC
但这会将所有未更新的条目放在结果的底部


基本上,我需要他们被排序的最后日期可用。如果没有可按
id

排序的可用项,请尝试
COALESCE

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

这不一定是你想要的,但很可能是你想要的方向。如果不正确,你能举一个你想要的例子吗?

你可以用案例陈述

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

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

SELECT *
FROM `entries`
ORDER BY IFNULL(`updated_at`,`created_at`) DESC, `id` DESC
如果其中一个日期可用,结果将按日期排序。 如果没有可用的日期,结果将按id排序


注意:您的DBMS上不一定可以使用IFNULL,但您可以找到一个等效项。

我相信您需要的是:

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

此命令按更新日期(如果可用)或创建日期(如果不可用)排序。然后按id降序排列。

coalesce中的类型必须相同,因此id在其中不起作用。我自己也有同样的quandry,因为coalesce似乎适合这个,除了id思维的类型差异?也许转换它?这看起来很不错,但是如果
COALESCE
确实不能与不同的类型一起使用,那么我就不能使用它。如果
updated\u在
created\u在
两个条目都是
NULL
的,那么它们将被放在其他条目之上,然后按
id
排序。我猜它将与IFNULL(更新的,创建的)描述的
订单一起工作
测试、确认和接受。这是最简单的方法,可以完成任务。