按姓氏排序列表,然后第一个

时间:2019-01-21 18:10:51

标签: mysql sql sql-order-by

我正在尝试对由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) ";

但是它只能按名字排序。

  • 亚当·斑马
  • 比利·格雷厄姆
  • 比利·斑马
  • Brian Doodles
  • 大卫·斑马
  • 詹姆斯·斑马
  • 吉尔涂鸦
  • Ryan Toon
  • Zedna Toon

但是将他的代码转换为这个可以使世界变得更美好:

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

@JoakimDanielson发布了一个有效的答案时,这是我最终要使用的代码:

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

仅因为它不需要substr函数。

我仍然将他作为正确的答案,以引导我到达正确的位置,我不确定一个人是否比另一个人更好。

答案 2 :(得分:0)

SQL的ORDER BY通常接受从左到右使用的列的列表...类似ORDER BY surname ASC, name ASC的东西可以工作吗?