首页 > 解决方案 > 按姓氏排序列表,然后首先

问题描述

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

    global $wpdb;
    $orderby = " SUBSTRING_INDEX( {$wpdb->posts}.post_title, ' ', -1 ) ASC"

在 wordpress 中,这样做是将 sql 语句返回到排序函数中。这可以按帖子标题的最后一个单词(在我的情况下为姓氏)进行排序,但如果两个人的姓氏相同,我希望它也按名字排序。

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

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

我想我可以以某种方式先按名字然后按姓氏对列进行排序,但我无法弄清楚。有没有办法做到这一点?

Jill Doodles
Brian Doodle
Billy Graham
Ryan Toon
Zedna Toon
James Zebra
Adam Zebra
David Zebra
Billy Zebra

但我希望它像这样排序:

Brian Doodles
Jill Doodles
Billy Graham
Ryan Toon
Zedna Toon
Adam Zebra
Billy Zebra
David Zebra
James Zebra

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) ";

但它只按名字排序。

但是将他的代码颠倒过来让世界变得更美好:

$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 ";

标签: mysqlsqlsql-order-by

解决方案


如果只有一个空格,即一个名字和一个姓氏,你可以这样做

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

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


推荐阅读