Mysql 先按姓氏对列表排序,然后按首字母排序

Mysql 先按姓氏对列表排序,然后按首字母排序,mysql,sql,sql-order-by,Mysql,Sql,Sql Order By,我正在尝试对wordpress生成的列表进行排序,但更为自定义 global $wpdb; $orderby = " SUBSTRING_INDEX( {$wpdb->posts}.post_title, ' ', -1 ) ASC" 在wordpress中,这是在将sql语句返回到排序函数中。 这可以根据文章标题的最后一个字(我的例子中是姓)进行排序,但是如果两个人的姓相同,我希望它也可以根据名字进行排序 所以我需要的是一个sql行,它将按姓氏排序,然后按名字排序 不幸

我正在尝试对wordpress生成的列表进行排序,但更为自定义

    global $wpdb;
    $orderby = " SUBSTRING_INDEX( {$wpdb->posts}.post_title, ' ', -1 ) ASC"
在wordpress中,这是在将sql语句返回到排序函数中。 这可以根据文章标题的最后一个字(我的例子中是姓)进行排序,但是如果两个人的姓相同,我希望它也可以根据名字进行排序

所以我需要的是一个sql行,它将按姓氏排序,然后按名字排序

不幸的是,它都存储在同一列中(post_title),我无法更改它

我想我可以先按名字再按姓氏对专栏进行排序,但我没办法弄清楚。有办法做到这一点吗

吉尔涂鸦 布莱恩·杜德尔 葛培理 瑞安·图恩 玉米DNA香椿 詹姆斯斑马 亚当斑马 大卫斑马 比利斑马 但我希望它是这样分类的:

Brian涂鸦
吉尔涂鸦
葛培理
瑞安·图恩
玉米DNA香椿
亚当斑马
比利斑马
大卫斑马
詹姆斯斑马
PER@JoakimDanielson,我试过这个:

 $orderby = " SUBSTR({$wpdb->posts}.post_title, 1, LOCATE(' ', {$wpdb->posts}.post_title) - 1), SUBSTR({$wpdb->posts}.post_title, LOCATE(' ', {$wpdb->posts}.post_title) + 1) ";
但它只按名字排序

  • 亚当斑马
  • 比利·格雷厄姆
  • 比利斑马
  • 布莱恩·杜德尔
  • 大卫斑马
  • 詹姆斯斑马
  • 吉尔涂鸦
  • 瑞安·图恩
  • 玉米DNA香椿
但将他的密码改为这一点让世界变得更美好:

$orderby = " SUBSTR({$wpdb->posts}.post_title, LOCATE(' ', {$wpdb->posts}.post_title) + 1) ASC, SUBSTR({$wpdb->posts}.post_title, 1, LOCATE(' ', {$wpdb->posts}.post_title) - 1) ASC ";

SQL的排序依据通常接受从左到右使用的列列表。。。如果只有一个空格,即一个名字和一个姓氏,您可以这样做

SELECT name
FROM table
ORDER BY SUBSTR(name, 1, LOCATE(' ', name) - 1),  
         SUBSTR(name, LOCATE(' ', name) + 1)

以上内容适用于MySql的5.6版本,但如果您有v8和更复杂的名称字符串,则可以使用正则表达式。

虽然@JoakimDanielson发布了一个有效的答案,但我最终使用了以下代码:

$orderby = " SUBSTRING_INDEX( {$wpdb->posts}.post_title, ' ', -1 ) ASC, {$wpdb->posts}.post_title ASC ";
只是因为它不需要
substr
函数


我仍在发布他的正确答案,以引导我找到正确的位置,我不完全确定其中一个比另一个好。

请提供示例数据、所需结果以及您正在使用的数据库的标签。谢谢@GordonLinoff。我补充道,我不擅长sql,所以我不确定我是否把它放对了。你能检查一下我的问题的最新情况吗?考虑到目前的情况,这是一个非常好的解决方案:)这对我来说不起作用,但它把我推向了正确的方向@rudtek我现在看到你写的是按名字排序,然后按姓氏排序,我的答案也是这样,但是你的预期输出是按姓氏排序的。因此,如果你想先姓,请切换两个substr。我哪里都没有写。你是说要反转你的代码行吗?是的,我只有一个1列,所以我需要一种方法在这一列上同时做这两件事。