在 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) 会产生意想不到的结果,出现状态=完成的结果行第一页的一半。
此外,最后一种方法可能会导致重复计算相同的值。
做这个的最好方式是什么?
怎么样...
ORDER BY (`status` = 'complete'), `priority`
Run Code Online (Sandbox Code Playgroud)
表达式status = 'complete'将解析为 0 表示未完成,1 表示完成...正是您想要的顺序...因此您将按优先级排序所有未完成的项目,然后是所有已完成的项目按优先级排序。