5

长期读者,第一次在这里发布海报。

我试图弄清楚如何为我正在编写的音乐应用程序对艺术家列表进行排序。

为了帮助理解数据库结构:我没有一个关系系统,其中歌曲表中的每首歌曲都有一个艺术家 ID,该 ID 引用艺术家表中的一行,我只是有一个歌曲列表,其中艺术家的名字作为一列中的字符串. 然后我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 查询中完成的优雅。

4

4 回答 4

12

这会将所有名称以 az 中的字母开头的艺术家放在那些不以字母开头的艺术家之前:

SELECT DISTINCT artist
FROM songs
ORDER BY artist REGEXP '^[a-z]' 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
于 2012-07-25T01:17:54.217 回答
2

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

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

这应该会将每个不以 AZ 或 az 开头的艺术家移动到您的订购末尾。

于 2012-07-25T01:30:54.597 回答
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 字符。属于其他字符集的字母不会被识别。

于 2012-07-25T01:26:59.853 回答
0

如果你想先按符号排序

  • ★★★符号★★★</li>
  • 101 头发护理
  • 美国广播公司
  • 定义

然后使用下面的查询

ORDER BY artist REGEXP '^[^A-Za-z0-9]' DESC, artist ASC
于 2015-04-10T02:26:43.293 回答