2013-03-19 80 views
0

我有如下表:訂購`updated_at`和`created_at`即使是NULL

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排序。

回答

3

我相信你想要的是:

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

該訂單由已更新的日期(如有)或創建日期(如果不可用)。然後它按id降序排列。

+0

測試,確認並接受。這是最簡單的,並完成工作。 – 2013-03-19 14:33:36

0

也許嘗試COALESCE

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

這不一定準確問什麼,但很可能進入你想要的方向。如果不對,可以發表一個你想要的例子嗎?

+0

在聚結的類型必須是相同的,所以ID就不會在那裏工作。我自己也有同樣的困惑,因爲除了id的類型不同之外,coalesce似乎適合這個。思考?也許轉換它? – 2013-03-19 13:53:34

+0

這看起來非常好,但如果'COALESCE'不能用於不同的類型,那麼我就無法使用它。 – 2013-03-19 14:02:17

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 
0

我完全不明白你想要什麼,但你可以試試這個:

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

如果這些日期的一個可用,結果將按照日期來排序。 如果沒有日期可用,結果將按id排序。

注:IFNULL是不是在你的DBMS一定可用,但你可以找到一個等效。

+0

如果某些條目的'updated_at'和'created_at'都是'NULL',那麼它們將被放在其他條目之上,然後按'id'排序。我想它可以用'ORDER BY IFNULL(updated_at,IFNULL(created_at,id))DESC' – 2013-03-19 13:59:12

相關問題