MySQL中如何按VARCHAR字段的第二个单词(姓氏)排序?
按姓氏对MySQL中的姓名字段排序
当然可以实现!不过MySQL里并没有直接的ORDER BY SECOND WORD这种语法,我们可以借助字符串处理函数来提取姓氏,再按它排序。下面分几种常见情况给你具体方案:
情况1:姓名是「名 姓」格式(含中间名时姓氏在最后)
大多数情况下,姓氏是姓名里的最后一个词,不管有没有中间名(比如John Michael Snow里的Snow),这时候用SUBSTRING_INDEX函数就能轻松提取姓氏:
SUBSTRING_INDEX(name, ' ', -1)的作用是:以空格为分隔符,取字符串最后一段内容,也就是我们要的姓氏。
对应的SQL查询语句:
SELECT name FROM your_table ORDER BY SUBSTRING_INDEX(name, ' ', -1) ASC;
情况2:确实需要取第二个词作为排序依据(仅「名 姓」无中间名场景)
如果你的数据里所有人都是严格的「名+空格+姓」格式,没有中间名,也可以精准取第二个词排序:
这里需要嵌套两次SUBSTRING_INDEX:先取前两个词,再从这两个词里取最后一个(也就是第二个词)。
SQL语句:
SELECT name FROM your_table ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 2), ' ', -1) ASC;
处理特殊情况:姓名含多个连续空格
如果你的name字段里存在多个连续空格(比如John Snow),可以先用正则替换把多空格统一成单个空格,再提取姓氏(MySQL 8.0及以上支持REGEXP_REPLACE):
SELECT name FROM your_table ORDER BY SUBSTRING_INDEX(REGEXP_REPLACE(name, '\\s+', ' '), ' ', -1) ASC;
小提示
如果遇到没有空格的姓名(比如单字名Cher),上面的方法也不会出错,SUBSTRING_INDEX会直接返回整个姓名,排序逻辑依然成立。
内容的提问来源于stack exchange,提问作者Lubos Chmelar
相关产品推荐
相关产品推荐

