6

ユーザー名を正しく並べ替えるには?

たとえば、次のクエリを実行します。

SELECT * FROM  `members` WHERE username LIKE  'bx%' ORDER BY username ASC 

結果:

bx1
bx10
bx11
bx12
bx13
bx14
bx15
bx16
bx17
bx18
bx19
bx2
bx20
bx21
bx3
bx4
bx5

私はこのように戻りたい:

bx1
bx2
bx3
bx4
bx5
...
bx15
bx16

等々

4

4 に答える 4

11
SELECT *
FROM `members`
WHERE username LIKE 'bx%'
ORDER BY LENGTH(username), username

これを行う必要があるという事実は、スキーマが非正規化されていることを示しています。可能であれば、操作を行う必要がある場合は、ユーザー名の整数部分を別の列に保存します。

SQL フィドルの例

于 2012-07-23T12:54:27.367 に答える
1

文字列を受け取り、展開された文字列を返すユーザー定義関数を作成する必要があります。仮定は次のとおりです。文字列には、末尾にある数値コンポーネントが 1 つだけ含まれており、fn のパディングによって決定される最大整数サイズよりも小さい場合があります。例: ABC1234 -> ABC00001234 ABC34 -> ABC00000034

  • 最後の文字から始めて、最初の非数値文字が見つかるまで、渡された文字列を 1 文字ずつ (位置を減らして) 繰り返します。(ハ)
  • 数値部分の長さを取得します (4)
  • 文字列の数値部分に複数の「0」文字を追加します (これにより、処理される数値部分の最大サイズが決まります) (例) 00001234
  • ABC00001234 を与える文字列の数値以外の部分によるプレフィックス
  • 出力

出力で並べ替え 計算フィールド (作成したばかりの関数を使用) を追加して、この値を返してインデックスを作成することもできます。

于 2012-07-23T13:19:43.437 に答える
0
SELECT * FROM  `members` 
WHERE username LIKE  'bx%' 
ORDER BY cast(substring(username, 3) as unsigned) ASC
于 2012-07-23T12:55:04.457 に答える
0

フレーズ bx が固定されている場合、

SELECT * FROM  `members` WHERE username LIKE  'bx%' 
ORDER BY replace(username,'BX','')*1 ASC  
于 2012-07-23T12:55:53.770 に答える