长期读者,这里的第一次海报。
我正在试图弄清楚如何为我正在写的音乐应用程序排序艺术家列表。
为了帮助理解数据库结构:我没有一个关系系统,歌曲表中的每首歌都有一个艺术家ID,引用艺术家表中的一行,我只是有一个歌曲列表,其中艺术家的名字是一个字符串在一列中。然后我在MySQL查询中使用GROUP BY artist
返回单个艺术家的列表。
我的应用程序以JSON编码数组的形式从我的服务器检索此数据,该数组是以下MySQL查询的结果:
SELECT artist FROM songs GROUP BY artist ORDER BY artist ASC
然而,这个查询结果是艺术家的名字如& i,+ NURSE和2007excalibur2007在字母结果之前排序(如AcousticBrony,ClaireAnneCarr,d.notive等)。
我需要的是名字以数字和符号开头的艺术家在按字母顺序排序的艺术家列表后返回
解决方案可以基于PHP,但我更喜欢在MySQL查询中完成它的优雅。
答案 0 :(得分:11)
这将使所有名字的艺术家以a-z中的字母开头,而不是那些:
SELECT DISTINCT artist
FROM songs
ORDER BY artist REGEXP '^[a-z]' DESC, artist
查看在线工作:sqlfiddle
但您可能更喜欢使用简化名称存储第二列,以便您可以将它们放入更有意义的顺序中:
artists
artist | simplified_name
------------------------------------
&i | i
+NURSE | nurse
2007excalibur2007 | excalibur
在MySQL中不能轻易生成simplified_name
的值,因此您可能希望使用通用编程语言来提取所有艺术家,将其转换为简化名称,然后使用结果填充数据库。
完成后,您可以使用此查询:
SELECT DISTINCT artist
FROM artists
ORDER BY simplified_name
答案 1 :(得分:2)
您可以添加一个额外的ORDER BY
子句,该子句将以非字母字符开头的项目放在最后,如下所示:
SELECT artist
FROM songs
ORDER BY artist REGEXP '^[^A-Za-z]' ASC, artist
这应该将每个不以A-Z或a-z开头的艺术家移动到您的订购结束。
答案 2 :(得分:0)
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字符。作为其他字符集一部分的字母将不会被识别为。
答案 3 :(得分:0)
如果您想先按符号排序
然后使用以下查询
ORDER BY artist REGEXP '^[^A-Za-z0-9]' DESC, artist ASC