次のスキーマを持つ MySQL テーブルがあります。
CREATE TABLE `events` (
`id` bigint(20) NOT NULL,
`name` text NOT NULL,
`time` text NOT NULL,
`city` text NOT NULL,
`description` text NOT NULL,
`contact_name` text NOT NULL,
`contact_number` text NOT NULL,
`contact_email` text NOT NULL,
`image` text NOT NULL,
`main_event` int(11) NOT NULL DEFAULT '0',
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
これで、時間列がテキスト型であることがわかります。時間からのサンプル エントリを以下に示します。
12/09/2017 05:45:00 pm
12/09/2017 02:00:00 pm
13/09/2017 10:30:00 am
今私が欲しいのは、日で区切られたエントリ、つまり 12/09/2017 と 13/09/2017 のエントリを取得することです。また、時間で昇順に並べ替える必要があります。だから私のサンプル出力は以下のようになります
12/09/2017 02:00:00 pm
12/09/2017 05:45:00 pm
それから
13/09/2017 10:30:00 pm
グループ連結を使用して ID を取得しようとし、DATE_FORMAT と STR_TO_DATE の組み合わせを使用してこのテキスト型の日付文字列を変換しようとしました。しかし、問題は、正しくソートできないことです。STR_TO_DATE で %p 引数を使用すると、出力が NULL になります。
現在、次のクエリを使用しています
SELECT GROUP_CONCAT(id) id, DAY(DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y'), '%Y-%m-%d')) day, MONTHNAME(DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y'), '%Y-%m-%d')) month, DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y'), '%Y-%m-%d') test FROM events WHERE main_event >= 0 GROUP BY DAY(DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y'), '%Y-%m-%d')), MONTH(DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y'), '%Y-%m-%d')) ORDER BY test ASC
出力は次のとおりです。
id day month test
13,10,14 11 September 2017-09-11
15,16,19 12 September 2017-09-12
しかし、私が望むのは、id も時間に基づいてソートする必要があるということです。つまり、午前 9:00:00 のエントリが最初に来て、次に午前 10:00:00 のエントリになります。
また、考え直して、以下のような結果を得た後、それらをソートしようとしました:
SELECT DATE_FORMAT(STR_TO_DATE(time, '%d/%m/%Y %h:%i %p'), '%d/%m/%Y %h:%i %p') t FROM events WHERE id = 15 or id = 16 or id = 19 ORDER BY t ASC
しかし、結果はNULLです