MySQL ORDER BY,使用列mod_time,但如果mod_time为0,则使用列create_time

时间:2010-05-27 19:27:27

标签: mysql sql-order-by

我想根据两列mod_time和create_time来订购结果。

我希望最近出席。目前我有

ORDER BY pr.mod_time DESC, pr.create_time DESC

如果项目未被修改,则会中断,在这种情况下,mod_time为0且仅设置了create_time。即使create_time大于任何其他mod_time,这也有效地将mod_time为0的任何内容放到排序的末尾。

我希望这是有道理的。

有没有办法可以使用ORDER BY来做到这一点?

谢谢,杰克

3 个答案:

答案 0 :(得分:4)

你可以用这个:

ORDER BY CASE WHEN pr.mod_time = 0 THEN pr.create_time
              ELSE pr.mod_time
         END DESC, pr.create_time DESC

或许这个更简单的版本是你想要的,假设一个项目在创建之前永远不会被修改:

ORDER BY GREATEST(pr.mod_time, pr.create_time) DESC, pr.create_time DESC

请注意,如果有的话,这些查询将无法使用索引。

答案 1 :(得分:2)

我不确定这是不是你的意思,但我会在以下情况下提供:

只需切换你的ORDER BY:

ORDER BY pr.create_time DESC, pr.mod_time DESC

这将导致它首先按create_time排序。

附注:您可以在创建时设置mod_time,以便创建的项目与create_time同时“修改”(创建)。这可能取决于您系统中还有其他功能。

答案 2 :(得分:0)

IFNULL(pr.create_time, pr.mod_time)添加为所选列之一。

IFNULL中指定ORDER BY的位置。