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(更新的,创建的)描述的订单一起工作
测试、确认和接受。这是最简单的方法,可以完成任务。