2015-07-23 4 views
2

Я пытаюсь сортировать по определенному характеру на строке, например,MySQL - сортировать по определенному последней строке символ

перед:

+----+---------+ 
| id | name | 
+----+---------+ 
| 1 | red  | 
| 2 | red-a | 
| 3 | red-xy | 
| 4 | blue | 
| 5 | blue-a | 
| 6 | blue-xy | 
+----+---------+ 

после:

+----+---------+ 
| id | name | 
+----+---------+ 
| 4 | blue | 
| 1 | red  | 
| 5 | blue-a | 
| 2 | red-a | 
| 6 | blue-xy | 
| 3 | red-xy | 
+----+---------+ 

существуют ли какие-либо способы категоризации на основе -a или -xy с использованием ORDER BY

Спасибо заранее.

ответ

1
SELECT 
    CASE 
    WHEN RIGHT(`name`,LENGTH(`name`)-INSTR(`name`,'-')) = `name` THEN '' 
    ELSE RIGHT(`name`,LENGTH(`name`)-INSTR(`name`,'-')) 
    END AS `suffix`, 
    `name` 
FROM 
    `table1` 
ORDER BY 
    `suffix`, `name` 

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

+1

Это работает! Большое спасибо! – brianlasta

1

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

select id, name from 
(
    select id, 
     name, 
     if (substring_index(name,'-', -1) = name, '', substring_index(name,'-', -1)) as grouping 
    from Table1 
    order by grouping, name 
) as subTable 

SQLFiddle here

[EDIT] На самом деле, что может быть упрощен до одного выбора с:

select id, 
     name 
from Table1 
order by if (substring_index(name,'-', -1) = name, '', substring_index(name,'-', -1)), name 
+0

Спасибо, это очень полезно! :) – brianlasta

1

Эти запросы более читабельны, и это, вероятно, самый простой способ сортировки по суффиксу

SELECT 
* 
, IF (LOCATE('-', name) = 0 
    , 0 
    , LENGTH(SUBSTRING_INDEX(name, '-', -1)) 
    ) 
    suffix_length 

FROM 
Table1 

ORDER BY 
suffix_length 
; 



SELECT 
* 

FROM 
Table1 

ORDER BY 
    IF (LOCATE('-', name) = 0 
    , 0 
    , LENGTH(SUBSTRING_INDEX(name, '-', -1)) 
    ) 
; 

См. Демо http://sqlfiddle.com/#!9/92b63/41

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