問題:
月の名前を指定して、月番号で行を並べ替えます(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番目)。