2013-09-19 7 views
2

У меня были некоторые неожиданные результаты с запросом MySQL. Я хочу естественно заказать заголовок моих сообщений (я запускаю WordPress, но я не думаю, что это связано).MySQL буквенно-цифровая колонка MySQL

Вот пример какого-то происходящего название, чтобы дать представление:

1-1-1a 
1-13-5j 
7-1 
9-1-2 
12-13-2a 

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

ORDER BY (posts.post_title+0) ASC 

Я до сих пор получая странный результат на одной странице результатов. Полный запрос выглядит следующим образом.

SELECT rlt13_posts.post_title 
FROM rlt13_posts 
INNER JOIN rlt13_term_relationships ON (rlt13_posts.ID = rlt13_term_relationships.object_id) 
INNER JOIN rlt13_postmeta ON (rlt13_posts.ID = rlt13_postmeta.post_id) 
JOIN rlt13_icl_translations t ON rlt13_posts.ID = t.element_id 
AND t.element_type IN ('post_rlt_rule') 
JOIN rlt13_icl_languages l ON t.language_code=l.code 
AND l.active=1 
WHERE 1=1 
    AND (rlt13_term_relationships.term_taxonomy_id IN (92,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,501)) 
    AND rlt13_posts.post_type = 'rlt_rule' 
    AND (rlt13_posts.post_status = 'publish') 
    AND ((rlt13_postmeta.meta_key = 'new_rule' 
     AND CAST(rlt13_postmeta.meta_value AS CHAR) = '')) 
    AND t.language_code='en' 
GROUP BY rlt13_posts.ID 
ORDER BY (rlt13_posts.post_title+0) ASC 

И этот запрос дает следующий результат после выполнения (результаты вне диапазона расположены аккуратно).

enter image description here

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

Любая помощь в получении этой сортировки (буквально) оценивается!

AND (rlt13_term_relationships.term_taxonomy_id IN (92, ****)) 

ответ

0

Это будет непросто в MySQL, поскольку есть трудности при работе с разделительной разделительной строкой. Как вариант, вы можете использовать функцию SUBSTRING_INDEX() как этот (запрос упрощенного)

SELECT 
    * 
FROM 
    t 
ORDER BY 
-- left: 
    CAST(SUBSTRING_INDEX(name, '-', 1) AS UNSIGNED), 
-- middle: 
    CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(name, '-', 2), '-', -1) AS UNSIGNED) 
-- right: 
    CAST(SUBSTRING_INDEX(name, '-', -1) AS UNSIGNED) 

-такж вы не должны забывать о преобразовании типа в целом (CAST() к UNSIGNED в случае, описанное выше). С образцами данных, которые будут:

 
+------+----------+ 
| id | name  | 
+------+----------+ 
| 1 | 1-1-1a | 
| 2 | 1-13-5j | 
| 4 | 7-1  | 
| 5 | 9-1-2 | 
| 3 | 12-13-2a | 
+------+----------+ 
+0

Спасибо большое! Я никогда не знал о функции SUBSTRING_INDEX. Я смог решить мою проблему. – GMBrian

Смежные вопросы