2

我有下表:

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.

4

4 回答 4

5

我相信你想要的是:

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

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

于 2013-03-19T14:02:07.597 回答
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
于 2013-03-19T13:51:34.277 回答
0

也许尝试COALESCE

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

这不一定完全符合您的要求,但它可能会朝着您想要的方向发展。如果不正确,您可以发布您想要的示例吗?

于 2013-03-19T13:51:23.693 回答
0

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

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

如果这些日期之一可用,则结果将按日期排序。如果没有可用的日期,则结果将按 id 排序。

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

于 2013-03-19T13:54:20.243 回答