Долгое время читатель, первый плакат здесь.
Я пытаюсь выяснить, как отсортировать список исполнителей для музыкального приложения, которое я пишу.
Чтобы понять структуру базы данных: вместо того, чтобы иметь реляционную систему, в которой каждая песня в таблице композиций имеет идентификатор исполнителя, который ссылается на строку в таблице художников, у меня просто есть список песен с именем исполнителя в виде строки в столбце , Затем я использую 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. Буквы, которые являются частью других наборов символов, не будут распознаваться как таковые.
если вы хотите сначала сортировать по символу
затем используйте ниже запрос
ORDER BY artist REGEXP '^[^A-Za-z0-9]' DESC, artist ASC