сортировать список по фамилии, затем первым - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь отсортировать список, сгенерированный WordPress, но немного более индивидуально.

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

В WordPress то, что он делает, возвращает этот SQL-оператор в функцию сортировки.Это работает для сортировки по последнему слову в названии поста (фамилия в моем случае), но если 2 человека имеют одинаковую фамилию, я бы хотел, чтобы она также сортировала по имени.

Итакмне нужна строка 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 ";

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Если есть только один пробел, то есть одно имя и одну фамилию, вы можете сделать это следующим образом

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

Выше работает с 5.6 MySql, но если у вас v 8 и более сложная строка имени, вы можете использовать регулярные выражения.

0 голосов
/ 21 января 2019

В то время как @JoakimDanielson опубликовал ответ, который сработал, это код, с которым я закончил:

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

Только в том, что ему не нужно substr функций.

Я все еще отправляю его как правильный ответ для того, чтобы привести меня в нужное место, и я не совсем уверен, что одно лучше другого.

0 голосов
/ 21 января 2019

SQL ORDER BY обычно принимает список столбцов, который используется слева направо ... будет ли что-то вроде ORDER BY surname ASC, name ASC работать?

...