MySQL
ORDER BY
サーチ…
コンテキスト
SELECT
の句には特定の順序があります。
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ...
ORDER BY ... -- goes here
LIMIT ... OFFSET ...;
( SELECT ... ) UNION ( SELECT ... ) ORDER BY ... -- for ordering the result of the UNION.
SELECT ... GROUP_CONCAT(DISTINCT x ORDER BY ... SEPARATOR ...) ...
ALTER TABLE ... ORDER BY ... -- probably useful only for MyISAM; not for InnoDB
ベーシック
ORDER BY x
x
は任意のデータ型です。
-
NULLs
はNULLs
以外のものに先行します。 - デフォルトは
ASC
(最も低いものから最も高いもの) - 文字
COLLATION
(VARCHAR
など)は、宣言のCOLLATION
に従ってCOLLATION
られます -
ENUMs
は、文字列の宣言順に並べられます。
ASCending / DESCending
ORDER BY x ASC -- same as default
ORDER BY x DESC -- highest to lowest
ORDER BY lastname, firstname -- typical name sorting; using two columns
ORDER BY submit_date DESC -- latest first
ORDER BY submit_date DESC, id ASC -- latest first, but fully specifying order.
-
ASC
=ASCENDING
、DESC
=DESCENDING
-
DESC
場合でもNULLs
が最初に来ます。 - 上記の例では、
INDEX(x)
、INDEX(lastname, firstname)
、INDEX(submit_date)
はパフォーマンスを大幅に向上させる可能性があります。
しかし、...最後の例のようにASC
とDESC
混在させることは、複合インデックスを使用して利益を得ることはできません。 INDEX(submit_date DESC, id ASC)
助けもありません - " DESC
"はINDEX
宣言で構文的に認識されますが無視されます。
いくつかのトリック
ORDER BY FIND_IN_SET(card_type, "MASTER-CARD,VISA,DISCOVER") -- sort 'MASTER-CARD' first.
ORDER BY x IS NULL, x -- order by `x`, but put `NULLs` last.
カスタムオーダー
SELECT * FROM some_table WHERE id IN (118, 17, 113, 23, 72)
ORDER BY FIELD(id, 118, 17, 113, 23, 72);
指定されたIDの順序で結果を返します。
id | ... |
---|---|
118 | ... |
17 | ... |
113 | ... |
23 | ... |
72 | ... |
IDがすでにソートされていて、行を取得する必要がある場合に便利です。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow