2015-08-05 2 views
1

У меня есть таблица вроде этого:MySQL ORDER BY возвращает неверные результаты для строк переменной длины

CREATE TABLE IF NOT EXISTS `tags` (
    `tid` int(11) NOT NULL, 
    `name` varchar(25) NOT NULL, 
    `type` enum('spec','gen','cat','app','ep') DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
ALTER TABLE `tags` ADD PRIMARY KEY (`tid`); 
ALTER TABLE `tags` MODIFY `tid` int(11) NOT NULL AUTO_INCREMENT; 

╔═════╤═══════════════════════╤════════╗ 
║ tid │ name     │ type ║ 
╟─────┼───────────────────────┼────────╢ 
║ 1 │ "spike"    │ NULL ║ 
║ 2 │ "gala dress"   │ 'app' ║ 
║ 3 │ "s1e1"    │ 'ep' ║ 
║ 4 │ "dragon"    │ 'spec' ║ 
║ 5 │ "backgroud character" │ 'cat' ║ 
║ 6 │ "s1e2"    │ 'ep' ║ 
║ 7 │ "male"    │ 'gen' ║ 
║ 8 │ "s1e3"    │ 'ep' ║ 
║ 9 │ "main six"   │ 'cat' ║ 
╚═════╧═══════════════════════╧════════╝

Running следующий запрос:

SELECT DISTINCT type FROM `tags` ORDER BY type DESC 

Результат не то, что я ожидал, ep сортируется вверху, в то время как она должна быть после cat:

╔════════╗ 
║ type ║ 
╟────────╢ 
║ 'ep' ║ 
║ 'app' ║ 
║ 'cat' ║ 
║ 'gen' ║ 
║ 'spec' ║ 
║ NULL ║ 
╚════════╝

Я предполагаю, что это потому, что 'ep' короче остальных пунктов, но как я могу сортировать таблицу без коротких строк сортируется перед длительными из них?

В этом конкретном случае I может сортировать с использованием первого символа в каждой строке, но я хотел бы получить будущее решение в случае, если 2 типа начнутся с той же буквы (ов) позже.

+0

Фактически, в алфавитном порядке «ep» должно быть до «cat», когда ваш заказ DESC. – Uueerdo

+0

Если вы действительно написали 'ORDER BY type DESC', результат будет абсолютно неправильным, должен быть spec, gen, ep, cat, app, NULL (см. Http://sqlfiddle.com/#!9/ce3e1/1). – dnoeth

ответ

5

Ваше поля является enum и MySQL сортирует внутреннее значение индекса:

`type` enum('spec','gen','cat','app','ep') DEFAULT NULL 
      0  1  3  4  5 

при сортировке desc, ep показывает первым, поскольку он имеет наибольшее значение индекса.

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