MySQL order by - 一列以另一列为条件

sdj*_*uan 5 mysql order-by

在 MySQL 中,我有一个表(针对这个问题进行了简化)

CREATE TABLE `projects` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `priority` int(11) DEFAULT '1000000',
  `status` enum('new','in_progress','complete') DEFAULT 'new',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 
Run Code Online (Sandbox Code Playgroud)

我想从按优先级排序的表中进行选择,但将状态为“完成”的行排在最后。

这有效:

SELECT * FROM projects 
order by 
    case 
        when status='complete' then 999999
        when status!='complete' then priority 
    end ASC
Run Code Online (Sandbox Code Playgroud)

但是将 999999 更改为 (select max(priority)+1 from projects) 会产生意想不到的结果,出现状态=完成的结果行第一页的一半。

此外,最后一种方法可能会导致重复计算相同的值。

做这个的最好方式是什么?

Mic*_*bot 6

怎么样...

ORDER BY (`status` = 'complete'), `priority`
Run Code Online (Sandbox Code Playgroud)

表达式status = 'complete'将解析为 0 表示未完成,1 表示完成...正是您想要的顺序...因此您将按优先级排序所有未完成的项目,然后是所有已完成的项目按优先级排序。