Php 如何对MySQL结果进行排序,首先是字母,最后是符号?

Php 如何对MySQL结果进行排序,首先是字母,最后是符号?,php,mysql,arrays,sorting,Php,Mysql,Arrays,Sorting,长期读者,第一次在这里张贴海报 我想知道如何为我正在编写的音乐应用程序排序艺术家列表 为了帮助理解数据库结构:我没有一个关系系统,其中songs表中的每首歌曲都有一个艺术家ID,该ID引用艺术家表中的一行,而只是在一列中有一个艺术家姓名为字符串的歌曲列表。然后在MySQL查询中使用GROUPBY ARTISTER返回单个艺术家的列表 My app以JSON编码数组的形式从我的服务器检索此数据,该数组是以下MySQL查询的结果: SELECT artist FROM songs GROUP BY

长期读者,第一次在这里张贴海报

我想知道如何为我正在编写的音乐应用程序排序艺术家列表


为了帮助理解数据库结构:我没有一个关系系统,其中songs表中的每首歌曲都有一个艺术家ID,该ID引用艺术家表中的一行,而只是在一列中有一个艺术家姓名为字符串的歌曲列表。然后在MySQL查询中使用GROUPBY ARTISTER返回单个艺术家的列表

My app以JSON编码数组的形式从我的服务器检索此数据,该数组是以下MySQL查询的结果:

SELECT artist FROM songs GROUP BY artist ORDER BY artist ASC
但是,此查询的结果是,名为&i、+NURSE和2007 Excalibur2007的艺术家排序在字母顺序的结果之前,如AcousticBrony、ClaireaneCarr、d.notive等

我需要的是艺术家的名字以数字开头,并在按字母顺序排列的艺术家列表后返回符号


这个解决方案可以是基于PHP的,但我更喜欢在MySQL查询中实现它的优雅。

这将使所有以字母a-z开头的艺术家的名字排在那些不以字母a-z开头的艺术家之前:

SELECT DISTINCT artist
FROM songs
ORDER BY artist REGEXP '^[a-z]' DESC, artist
在线查看它的工作情况:

但是,您可能更喜欢使用简化名称存储第二列,以便按更合理的顺序排列:

artists

artist            | simplified_name
------------------------------------
&i                | i
+NURSE            | nurse
2007excalibur2007 | excalibur
在MySQL中无法轻松生成simplified_name的值,因此您可能希望使用通用编程语言提取所有美工人员,将其转换为简化名称,然后用结果填充数据库

完成此操作后,您可以使用以下查询:

SELECT DISTINCT artist
FROM artists
ORDER BY simplified_name
这将对所有以字母字符开头的艺术家进行排序,然后是非字母字符

注意,由于ascii的工作方式,[\]&`将被视为按字母顺序排列。如果这很重要,您可以将其拆分为两个布尔表达式,分别处理大写字母和小写字母

或者可能:

ORDER BY ASCII(UPPER(SUBSTR(artist, 1, 1))) NOT BETWEEN 65 AND 90, artist
请注意,这仅适用于ascii字符。属于其他字符集的字母将无法识别。

您可以添加额外的ORDER BY子句,将以非字母字符开头的项目放在最后,如下所示:

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

这会将每个不以A-Z或A-Z开头的艺术家移动到您的订单末尾。

如果您想先按符号排序

★★★ 象征★★★ 101护发 Abc Def 然后使用下面的查询

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

我没有一个关系系统,其中songs表中的每首歌曲都有一个艺术家ID,该ID引用艺术家表中的一行,我只是在一列中有一个艺术家姓名为字符串的歌曲列表。为什么?看来这不可能。从理论上讲,您可以创建一个自定义排序规则,但这并不简单:第一个问题做得很好@迈克:我的答案怎么了?我发布了与Ollie几乎完全相同的解决方案。@JacobPritchett:REGEXP返回0或1。如果名称以字母开头,则REGEXP“^[a-z]”返回1,否则返回0。然后按降序排序,因此1排在第一位。REGEXP“^[^A-Za-z]”如果不是以字母开头,则返回1,但因为它是升序,所以1排在最后。实际上,我刚刚重新阅读了你的帖子,你希望在其他匹配之后使用符号,这不是我的答案。哦,糟糕。我想知道为什么我没有想到这么简单的修复。你用REGEXP“^[a-z]”DESC编辑的,是艺术家做的!非常感谢马克,关于代理密钥的建议你是对的。另外,在你编辑你的答案之前,我写下了我的答案,包括额外的ORDERBY子句。@OllieJones:好的。我不确定谁是第一个。我编辑的时间戳几乎和你的帖子在同一时间。这是最好的答案,我不愿意承认这一点+很好的技术OllieThanks,这似乎也很有效。我很好奇为什么艺术家REGEXP'^[a-z]'DESC,艺术家会返回相同的结果。^[a-z]和^[^a-Za-z]之间有什么区别?为什么需要将降序改为升序?没关系,明白了:
ORDER BY artist REGEXP '^[^A-Za-z0-9]' DESC, artist ASC