5

長年の読者、初めてのポスターはこちら。

自分が書いている音楽アプリのアーティストのリストを並べ替える方法を見つけようとしています。

データベース構造を理解しやすくするために:songsテーブルの各曲がartistsテーブルの行を参照するアーティストIDを持つリレーショナルシステムではなく、列にアーティストの名前が文字列として含まれる曲のリストを作成します。 。次にGROUP BY artist、MySQLクエリで使用して、個々のアーティストのリストを返します。

私のアプリは、次のMySQLクエリの結果であるJSONエンコードされた配列の形式でサーバーからこのデータを取得します。

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


ただし、より意味のある順序でそれらを配置できるように、簡略化された名前で2番目の列を格納することをお勧めします。

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

これにより、アルファベット以外の文字の前にアルファベット文字で始まるすべてのアーティストが注文されます。

アスキーがどのように機能するかにより、[\]&_`はアルファベット順と見なされることに注意してください。これが重要な場合は、2つのブール式に分割して、大文字と小文字を別々に行うことができます。

または多分:

ORDER BY ASCII(UPPER(SUBSTR(artist, 1, 1))) NOT BETWEEN 65 AND 90, artist

これはASCII文字に対してのみ機能することに注意してください。他の文字セットの一部である文字は、そのように認識されません。

于 2012-07-25T01:26:59.853 に答える
0

最初に記号で並べ替える場合

  • ★★★記号★★★</li>
  • 101ヘアケア
  • Abc
  • Def

次に、以下のクエリを使用します

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