You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中MBT格式编码的自然排序功能失效如何解决

解决方案

你的编号规则是固定格式MBT[数字1]-[数字2]N-[数字3],只需要把三段数字分别提取后按数值排序即可,正确的SQL写法如下:

SELECT post_title FROM `wp_posts` 
WHERE post_type = 'product' AND post_title LIKE 'MBT%' 
ORDER BY
  -- 第一段排序:提取MBT后到第一个横杠前的数值排序
  CAST(SUBSTRING(SUBSTRING_INDEX(post_title, '-', 1), 4) AS UNSIGNED) ASC,
  -- 第二段排序:提取两个横杠中间的内容去掉N后转数值排序
  CAST(TRIM(TRAILING 'N' FROM SUBSTRING_INDEX(SUBSTRING_INDEX(post_title, '-', 2), '-', -1)) AS UNSIGNED) ASC,
  -- 第三段排序:提取最后一个横杠后的数值排序
  CAST(SUBSTRING_INDEX(post_title, '-', -1) AS UNSIGNED) ASC;

如果是在WordPress的查询中调用,排序段的写法为:

$order_by = "
  CAST(SUBSTRING(SUBSTRING_INDEX({$wpdb->posts}.post_title, '-', 1), 4) AS UNSIGNED) ASC,
  CAST(TRIM(TRAILING 'N' FROM SUBSTRING_INDEX(SUBSTRING_INDEX({$wpdb->posts}.post_title, '-', 2), '-', -1)) AS UNSIGNED) ASC,
  CAST(SUBSTRING_INDEX({$wpdb->posts}.post_title, '-', -1) AS UNSIGNED) ASC
";

原写法问题说明

之前的写法存在两个核心问题:

  • 没有完整拆分所有数字段转数值排序,字符串逐位比较时会出现12N排序不符合数值逻辑的问题
  • 多余的长度排序规则会把字符数更长的编号强制后置,导致MBT1212-12N-1这类编号出现在MBT2020-8N-1之后

内容的提问来源于stack exchange,提问作者Anibal Mauricio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:15:05