SQL棘手的顺序

时间:2012-09-21 16:54:21

标签: php mysql sql sql-order-by

我试图订购退货套装,但我很难让它正确订购。

我选择字段,每个字段都有date_updateddate_added。 添加字段时,date_updated为空,直到有更新,然后分配当前日期。

我需要通过将最近的条目放在BOTTOM上来排序我的列表,并将最旧的条目放在顶部。所以如果添加一个项目,它应该直接到底部。有没有办法将所有日期字段连接在一起,然后按最旧到最新排序,忽略更新或添加?

这可能听起来有些令人困惑,但我已经尝试过ORDER BY date_added DESC, date_updated ASC这样的事情的多种组合,但它并没有做我需要它做的事情。我得到date_added排序的顶部,然后是date_updated的单独排序......

任何输入在这里都会非常有用......

4 个答案:

答案 0 :(得分:4)

order by coalesce(date_updated, date_added)

COALESCE DOC

答案 1 :(得分:1)

您可以尝试CASE声明

SELECT 
    firstname, 
    lastname, 
    date_added, 
    date_updated, 
    CASE date_updated IS NULL 
        THEN date_added 
        ELSE date_updated 
    END CASE AS order_date  
FROM mytable 
ORDER BY order_date DESC

这样做是检查date_updated是否为空,然后在新列中放入date_added的值。如果没有,它会放置date_updated。新列名为order_date,用于排序。

您还可以在ORDER BY子句中添加CASE语句,但这可能会降低查询速度,因为它必须在索引与构造数据时进行连接。虽然没有定论,但如果在SELECT与ORDER BY中使用CASE,我发现性能略有提升。

答案 2 :(得分:0)

CASE条款中使用Order By

ORDER BY CASE WHEN date_updated IS NULL
              THEN 0 
              ELSE 1
          END DESC, date_added DESC

答案 3 :(得分:0)

Order by IsNull(DateUpdated,DateAdded)

将是一种方式