mysql - 按姓氏排序列表,然后首先
问题描述
我正在尝试对 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 ";
解决方案
如果只有一个空格,即一个名字和一个姓氏,你可以这样做
SELECT name
FROM table
ORDER BY SUBSTR(name, 1, LOCATE(' ', name) - 1),
SUBSTR(name, LOCATE(' ', name) + 1)
以上适用于 5.6 的 MySql,但如果您有 v 8 和更复杂的名称字符串,您可以使用正则表达式。
推荐阅读
- c# - 如何使用 C# 在 ASP.NET 中保护用户登录?
- node.js - 发布 50k 条消息时,pubsub-emulator 抛出错误和发布者抛出“在收到任何响应之前超过重试总超时”
- kotlin - kotlin 对象(本地最终类)不可序列化
- haskell - Haskell - 安全可靠的扩展
- java - 如何从 JVMTI 中的 Step Event 中排除非项目类?
- javascript - 在 react.js 中使用 Array.map
- ethereum - Solidity 6.0 的问题(返回不起作用)
- python - 类型错误:参数“img”的预期 cv::UMat
- javascript - 在antd 4中将初始值设置为动态形式
- php - 将文件上传到 PHP 时为空 $_FILES 数组