Как отсортировать результаты MySQL с буквами сначала, символы последними?

Долгое время читатель, первый плакат здесь.

Я пытаюсь выяснить, как отсортировать список исполнителей для музыкального приложения, которое я пишу.

Чтобы понять структуру базы данных: вместо того, чтобы иметь реляционную систему, в которой каждая песня в таблице композиций имеет идентификатор исполнителя, который ссылается на строку в таблице художников, у меня просто есть список песен с именем исполнителя в виде строки в столбце , Затем я использую GROUP BY artist в запросе MySQL, чтобы вернуть список отдельных исполнителей.

Мое приложение извлекает эти данные с моего сервера в виде массива, закодированного JSON, который является результатом следующего запроса MySQL:

 SELECT artist FROM songs GROUP BY artist ORDER BY artist ASC 

Однако этот запрос приводит к тому, что художники с именами типа & i, + NURSE и 2007excalibur2007 сортируются перед алфавитными результатами (такими как AcousticBrony, ClaireAnneCarr, d.notive и т. Д.).

Мне нужны художники, имена которых начинаются с цифр и символов, возвращаемых после списка отсортированных в алфавитном порядке.

Решение может быть основано на PHP, но я бы предпочел, чтобы его элегантность выполнялась в запросе MySQL.

Это поместит всех художников, имена которых начинаются с буквы в az до тех, которые этого не делают:

 SELECT DISTINCT artist FROM songs ORDER BY artist REGEXP '^[az]' DESC, artist 

Смотрите, как он работает в Интернете: sqlfiddle


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

 artists artist | simplified_name ------------------------------------ &i | i +NURSE | nurse 2007excalibur2007 | excalibur 

Значения для simplified_name не могут быть легко сгенерированы в MySQL, поэтому вы можете использовать язык программирования общего назначения, чтобы вытащить всех художников, преобразовать их в упрощенные имена, а затем заполнить базу данных результатами.

Как только это будет сделано, вы можете использовать этот запрос:

 SELECT DISTINCT artist FROM artists ORDER BY simplified_name 

Вы можете добавить дополнительное предложение ORDER BY , которое помещает элементы, которые начинаются с неалфавитного символа последним, например:

  SELECT artist FROM songs ORDER BY artist REGEXP '^[^A-Za-z]' ASC, artist 

Это должно привести к тому, что каждый художник не начнет работу с AZ или az до конца вашего заказа.

 ORDER BY ASCII(SUBSTR(artist, 1, 1)) NOT BETWEEN 65 AND 122, artist 

Это будет заказывать всех художников, которые начинаются с алфавитного символа до не алфавитного.

Обратите внимание, что из-за того, как ascii работает [\] & _ `, будет считаться алфавитным. Если это имеет значение, вы можете разбить его на два булевых выражения, чтобы делать буквы верхнего и нижнего регистра отдельно.

Или, может быть:

 ORDER BY ASCII(UPPER(SUBSTR(artist, 1, 1))) NOT BETWEEN 65 AND 90, artist 

Имейте в виду, что это будет работать только для символов ascii. Буквы, которые являются частью других наборов символов, не будут распознаваться как таковые.

если вы хотите сначала сортировать по символу

  • ★★★ Символ ★★★
  • 101 Уход за волосами
  • азбука
  • Защита

затем используйте ниже запрос

 ORDER BY artist REGEXP '^[^A-Za-z0-9]' DESC, artist ASC