MySQL查询如何实现先按url空值升序再按id降序排序
解决方案:先按URL是否为空排序,再按ID降序
你遇到的问题是因为ORDER BY url ASC是按照字符串的字典顺序排序,而非专门区分“空字符串”和“非空字符串”的优先级。要实现先把空URL的记录排在前面,再按ID降序的效果,可以用CASE表达式给空URL的记录设置更低的排序权重,具体修改后的SQL语句如下:
SELECT * FROM r WHERE r.type IN('product','manual_change') ORDER BY CASE WHEN url = '' THEN 0 ELSE 1 END ASC, id DESC;
原理说明:
CASE WHEN url = '' THEN 0 ELSE 1 END ASC:这个表达式会把所有url为空字符串的记录标记为0,非空的标记为1。按这个值升序排列时,0会排在1前面,也就是空URL的记录会优先出现在结果集中。- 紧接着的
id DESC会在URL状态相同的分组内,按照id从大到小排序,满足你的二次排序需求。
针对你的测试数据验证:
执行上述语句后,结果会先返回id=38(唯一的空URL记录),然后依次是id=42、id=41、id=43、id=39、id=29、id=24、id=22、id=20、id=19,完全符合“先空URL、再ID降序”的排序逻辑。
如果你的表后续允许url字段为NULL,可以把CASE条件调整为CASE WHEN url IS NULL OR url = '' THEN 0 ELSE 1 END ASC,这样能同时覆盖NULL和空字符串的情况。
内容的提问来源于stack exchange,提问作者bobi
相关产品推荐
相关产品推荐

