PHP按姓氏中间名排序

时间:2015-04-13 13:39:17

标签: php mysql wordpress

我有一个名为last_name的数据库字段。
我想按姓氏订购列表。

这是一个例子:
命名
Jan DSmit
Jan van de WSmit
Jan van ASmit
Jan de FSmit

我尝试使用SUBSTRING INDEX执行此操作但仅搜索空格。我有多个。
我有一个查询命令姓氏字段

$query = "SELECT user_id, meta_value as name 
          FROM $wpdb->usermeta 
          WHERE meta_key 
          LIKE 'last_name' 
          AND user_id 
          IN (SELECT user_id 
              FROM $wpdb->usermeta 
              WHERE meta_key='company' 
              AND meta_value IN ('".$imploded_brands."')) 
              ORDER BY name";

$implode_brands拥有一系列品牌名称 这样做有效但是当订单开始时,所有以“面包车”开头的人都会把它放在一边。或者' de'彼此旁边就像脚本告诉它要做的那样。我想订购'面包车后面的名字。和' de'。

预期结果应为:
命名
Jan van ASmit
Jan DSmit
Jan de FSmit
Jan van de WSmit

----编辑----
经过一些阅读后,我发现:thisthis

申请之后没有工作但也许我在这里做错了

$query = "SELECT user_id, meta_value as name 
          FROM $wpdb->usermeta 
          WHERE meta_key 
          LIKE 'last_name' 
          AND user_id 
          IN (
             SELECT user_id 
             FROM $wpdb->usermeta 
             WHERE meta_key='company' 
             AND meta_value IN ('".$imploded_brands."')) 
             ORDER BY REPLACE (REPLACE (last_name, ' van ', ' '), ' de ', ' ')";

2 个答案:

答案 0 :(得分:1)

如果我正确掌握了你的目标对我没有意义。

但万一你确实需要尝试:

$query = "SELECT user_id, meta_value as name 
          FROM $wpdb->usermeta 
          WHERE meta_key 
          LIKE 'last_name' 
          AND user_id 
          IN (SELECT user_id 
              FROM $wpdb->usermeta 
              WHERE meta_key='company' 
              AND meta_value IN ('".$imploded_brands."')) 
          ORDER BY REPLACE (REPLACE (name, ' van ', ' '), ' de ', ' ')";

您可以尝试将查询中的最后一行替换为:

ORDER BY REPLACE (REPLACE (last_name, ' van ', ' '), ' de ', ' ')";

答案 1 :(得分:0)

在我看来,最好在php中对结果数组进行排序,而不是直接从查询中对数据进行排序。所以这样的事情应该有效:

function cmp($a, $b)
{
  $a = str_replace("van", "", $a);
  $a = str_replace("de", "",$a);
  $b = str_replace("van", "", $b);
  $b = str_replace("de", "",$b);
  return strnatcmp($a, $b);
}

usort($result_without_order, 'cmp');

未经测试,但我认为它应该可以正常工作,并为您提供预期的结果。