MySQL ORDER BY, используйте столбец mod_time, но если mod_time равен 0, используйте столбец create_time - PullRequest
2 голосов
/ 27 мая 2010

Я хочу упорядочить результаты по двум столбцам: mod_time и create_time.

Я хочу, чтобы присутствовали самые последние. На данный момент у меня есть

ORDER BY pr.mod_time DESC, pr.create_time DESC

Это прерывается, если элемент не был изменен, в этом случае mod_time равен 0 и устанавливается только create_time Это эффективно помещает все с mod_time 0 в конец порядка, даже если create_time больше, чем любое другое mod_time.

Надеюсь, это имеет смысл.

Есть ли способ, которым я могу использовать ORDER BY для этого?

Спасибо, Джейк

Ответы [ 3 ]

4 голосов
/ 27 мая 2010

Вы можете использовать это:

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

Обратите внимание, что эти запросы не смогут использовать индекс, если он есть.

2 голосов
/ 27 мая 2010

Я не уверен, что это то, что вы имеете в виду, но я предложу это в случае:

Просто переключите ваш ЗАКАЗ на:

ORDER BY pr.create_time DESC, pr.mod_time DESC

Это приведет к сортировке сначала по create_time.

Примечание: Вы можете установить mod_time во время создания, чтобы созданный элемент был «изменен» (создан) одновременно с create_time. Это, вероятно, зависит от того, что еще происходит в вашей системе.

0 голосов
/ 27 мая 2010

Добавить IFNULL(pr.create_time, pr.mod_time) в качестве одного из выбранных столбцов.

Укажите положение IFNULL в ORDER BY.

...