我有下表:
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_at
和created_at
对这些条目进行排序。
但其中任何一个都可能是NULL
。
我的查询:
SELECT *
FROM `entries`
ORDER BY `updated_at` DESC, `created_at` DESC, `id` DESC
但是这会将结果底部未更新的每个条目都放在其中。
基本上我需要按照可用的最后日期对它们进行排序。如果没有可用的id
排序。
答案 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,但您可以找到等效的。