【发布时间】:2012-07-25 01:08:14
【问题描述】:
老读者,第一次发帖。
我正试图弄清楚如何为我正在编写的音乐应用程序对艺术家列表进行排序。
为了帮助理解数据库结构:我没有一个关系系统,其中歌曲表中的每首歌曲都有一个艺术家 ID,该 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 查询中完成它的优雅。
【问题讨论】:
-
"而不是有一个关系系统,其中歌曲表中的每首歌曲都有一个艺术家 ID 引用艺术家表中的一行,我只是有一个歌曲列表,其中艺术家的名字作为字符串一个专栏。”为什么?
-
AFAIK 这是不可能的。从理论上讲,您可以创建自定义排序规则,但这并非易事:forge.mysql.com/wiki/How_to_Add_a_Collation
-
第一个问题做得很好!
-
@MikeS.:我的回答有什么问题?我发布了与 Ollie 几乎完全相同的解决方案。
-
@JacobPritchett:REGEXP 返回 0 或 1。如果名称以字母开头,
REGEXP '^[a-z]'返回 1,否则返回 0。然后按降序排序,因此 1 排在第一位。REGEXP '^[^A-Za-z]'如果不以字母开头,则返回 1,但因为它是升序,所以 1 排在最后。