我正在尝试对由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 ";
答案 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
的东西可以工作吗?