У меня есть таблица вроде этого: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 типа начнутся с той же буквы (ов) позже.
Фактически, в алфавитном порядке «ep» должно быть до «cat», когда ваш заказ DESC. – Uueerdo
Если вы действительно написали 'ORDER BY type DESC', результат будет абсолютно неправильным, должен быть spec, gen, ep, cat, app, NULL (см. Http://sqlfiddle.com/#!9/ce3e1/1). – dnoeth