«Естественная сортировка» с MySQL? - PullRequest
0 голосов
/ 21 июня 2010

Я пытаюсь сделать запрос к базе данных Wordpress и отсортировать заголовки сообщений в правильном порядке. Заголовки отформатированы так: Заголовок 1, Заголовок 2. Мне нужно отсортировать их в порядке возрастания, как я могу это сделать? Если я просто отсортирую их по возрастанию, они получатся как: 1,10,11 ...

Сейчас мой заказ по заявлению такой, но он ничего не делает:

ORDER BY CONVERT(p.post_title,SIGNED) ASC;

Ответы [ 2 ]

2 голосов
/ 21 июня 2010

Функции для каждой строки - плохая идея в любой базе данных, которую вы хотите хорошо масштабировать. Это потому, что они должны выполнить вычисления для каждой строки, которую вы извлекаете каждый раз, когда вы делаете select.

Интеллектуальный способ администратора баз данных - создать новый столбец, содержащий вычисленный ключ сортировки, и использовать триггер вставки / обновления, чтобы убедиться, что он установлен правильно. Означает, что расчет выполняется только при необходимости и амортизирует его стоимость для всех вариантов выбора.

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

И, используя этот метод и индексируя новый столбец, ваши запросы будут абсолютно кричать.

Таким образом, вы создаете еще один столбец с именем natural_title, отображаемый следующим образом:

title          natural_title
-----          -------------
title 1        title 00001
title 2        title 00002
title 10       title 00010
title 1024     title 01024

гарантирует, что функция отображения, используемая в триггере, позволяет максимально допустимое значение. Затем вы используете запрос как:

select title from articles
order by natural_title asc
0 голосов
/ 21 июня 2010

Если символ # всегда в конце, вы можете выполнить некоторые манипуляции со строками, чтобы он заработал:

SELECT *, CAST(RIGHT(p.post_title,2) AS UNSIGNED) AS TITLE_INDEX 
FROM wp_posts p
ORDER BY TITLE_INDEX asc

Возможно, придется немного подправить его, предполагая, что у вас может быть число от 100+ или 1000+.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...