Как отсортировать MYSQL-запрос для отображения в алфавитном порядке, с последними номерами, не включая слово «The» в сортировке - PullRequest
0 голосов
/ 21 сентября 2011

В основном у меня есть запрос PHP MYSQL, который возвращает 16 элементов. 15 из них начинаются с букв A-Z, а одна начинается с цифры (название продукта «3d Star Gazer»). В обычном запросе сортировка в алфавитном порядке отображает этот элемент, который начинается численно первым. Я хочу, чтобы список сортировался в алфавитном порядке, а 3D Star Gazer отображается последним.

Возможно ли это?

SELECT t1.id, t2.name, t2.manufacturer
FROM db.t1
  LEFT JOIN db.t2 ON t1.id = t2.id
WHERE year = '2011'
ORDER BY t2.name ASC

Я видел эту ссылку: Сортировка результатов MySQL в алфавитном порядке, но с последними числами , но решение не помогло мне ...

В качестве вторичного вопроса, возможно ли не включать слово "The" в сортировку? Например, игра называется «Игра в догадки», я хочу, чтобы она выглядела как «G», а не как «T».

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

Использование оператора IF () и добавление двух столбцов для управления порядком сортировки:

SELECT t1.id, t2.name, t2.manufacturer,
   IF(LEFT(t2.name, 1) BETWEEN '0' AND '9', 2, 1) as sortOrder1,
   IF(t2.name LIKE 'The _%', SUBSTRING(t2.name FROM  5), t2.name) as trimmedName
FROM db.t1
   LEFT JOIN db.t2 ON t1.id = t2.id
WHERE year = '2011'
ORDER BY sortOrder1, trimmedName;

Знак подчеркивания в шаблоне для оператора LIKE соответствует любому отдельному символу и используется для проверки того, чтовозвращаемая подстрока не будет нулевой.

Если вы не хотите, чтобы дополнительные столбцы были в вашем конечном выводе, оберните вышеприведенный оператор выбора внутри другого:

SELECT id, name, manufacturer FROM ([select statement above]) a;
1 голос
/ 21 сентября 2011

Результаты поиска в этом ответе

Сортировка результатов MySQL по алфавиту, но с последними номерами

с особым вниманием к заказу кейс

Что касается извлечения "the", я уверен, что вы могли бы что-то сделать в строках

 trim( replace( name, 'The','') ) as name_order

и затем порядок, основанный на этом, в сочетании с порядком, указанным в связанном ответе.

0 голосов
/ 21 сентября 2011

Вы можете сделать объединение, сначала вы выбираете значения, которые начинаются с букв, а во втором запросе вы выбираете те, которые начинаются с цифр

(select .... order by <<letter>>) union (select ... order by <<number>>) 
...