問題:
月の名前を指定して、月番号で行を並べ替えます(1月を最初に表示し、12月を最後に表示します)。
例:
birthday
テーブルには、nameとbirthday_month
の2つの列が含まれています 。月は数字ではなく名前で示されます。p>
name | birthday_month |
---|---|
Ronan Tisha | NULL |
12月 | 2020 |
アンジージュリア | 4月 |
Narelle Dillan | 4月 |
Purdie Casey | 1月 |
Donna Nell | NULL |
Blaze Graeme | 10月 |
行をbirthday_month
で並べ替えたい 。
解決策:
SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');
結果は次のようになります:
name | birthday_month |
---|---|
Donna Nell | NULL |
Purdie Casey | 1月 |
アンジージュリア | 4月 |
Narelle Dillan | 4月 |
Blaze Graeme | 10月 |
Ronan Tisha | NULL |
12月 | 10月 |
ディスカッション:
月単位で注文するには、今月の日付を作成します。これを行うには、STR_TO_DATE()関数を使用します。 'Year Month Day
に文字列として日付を保存している場合 '形式。STR_TO_DATE(date_string, '%Y %M %d')
を使用して日付にキャストできます。 。
まず、CONCAT()関数を使用して文字列を作成する必要があります。年は任意の年にすることができます(例:0001
)、その日は任意の日にすることができます(例:01
):
CONCAT('0001 ', birthday_month, ' 01')
CONCAT()
関数は、すべての引数を1つの文字列に結合します。文字列は「Year Month Day
」に含まれている必要があります '形式なので、2番目の引数はbirthday_month
である必要があります;最初と3番目の引数は正しい形式である必要があります。
次に、STR_TO_DATE(date_string, '%Y %M %d')
を使用してこの文字列を日付に変換する必要があります 働き。この関数の2番目の引数は、日付の形式です。 %Y
年を表し、%M
月(数字ではなくフルネーム)を表し、 %d
日を表します。
STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')
ORDER BY
で使用します 行を日付の昇順で並べ替える句。行を降順で表示したい場合は、DESC
を追加するだけです。 このようなキーワード:
SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;
MySQLでは、NULL
sは、昇順で並べ替えるときに最初に表示され、降順で並べ替えるときに最後に表示されます。また、同じbirthday_month
の行 ランダムな順序で表示されます(Angie Julia
が表示される場合があります 3番目とNarelle Dillan
4番目、またはNarelle Dillan
3番目とAngie Julia
4番目)。