0

リーグと呼ばれる列を持つ MYSQL のテーブルがあります。

このクエリを使用して値を並べ替えようとすると、正しく並べ替えることができません。

SELECT DISTINCT (
t.league
)
FROM teams t
GROUP BY t.league
ORDER BY t.league ASC 

しかし、これで私は得る:

11a12
13
14
15
16a17
5a7
8a10

最後の2つを除いて、すべて正しくソートされているようです

何か案は?

ありがとう

4

2 に答える 2

5

いいえ、数値ではなく辞書順でソートされています。

11a12
13
14
15
16a17
5a7        # 5 is greater than 1
8a10

それらを数値で並べ替えたい場合は、次のようなものを使用できます。

order by (t.league + 0)
order by cast (t.league, int)

しかし、フィールド内の数値以外をどのように処理するかはわかりません。関数lpad使用を検討することをお勧めします。

order by lpad (t.league, 20, '0')

これは、フィールドの前に文字を付けて、フィールドを特定のサイズにパディングします0

行ごとの関数が適切にスケーリングされることはめったにないことに注意してください。テーブルのサイズが大きくなってもパフォーマンスを維持したい場合は、列をコンポーネントに分割して、数値のものを非テキストにするなどの操作を行うことができます。特定の状況に応じて、それが機能する場合と機能しない場合があります。

于 2012-04-05T02:20:00.433 に答える
4

はい、列は文字列型である必要があり、5AFTER が来11ます。これらのフィールド (複数評価されているように見える) を 2 つの別個の数値フィールド (またはそのa値が違いを生む場合は 3 つ) に変更することを検討してください。

于 2012-04-05T02:19:38.633 に答える