まずはテーブルとデータの用意。
CREATE TABLE `order_test` (
`id` bigint NOT NULL AUTO_INCREMENT,
`point` int DEFAULT NULL,
`priority_1` int DEFAULT NULL,
`priority_2` int DEFAULT NULL,
`created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
INSERT INTO
sandbox.order_test (`point`, priority_1, priority_2, created, modified)
VALUES
(
3,
2,
4,
'2020-11-03 18:40:30',
'2020-11-03 19:19:38'
),(
NULL,
2,
3,
'2020-11-03 18:43:49',
'2020-11-03 19:19:38'
),(
2,
1,
2,
'2020-11-03 18:44:07',
'2020-11-03 19:19:38'
),(
2,
1,
1,
'2020-11-03 19:19:21',
'2020-11-03 19:19:21'
);
SELECT * FROM order_test;
id|point|priority_1|priority_2|created |modified |
--|-----|----------|----------|-------------------|-------------------|
1| 3| 2| 4|2020-11-03 18:40:30|2020-11-03 19:19:38|
2| | 2| 3|2020-11-03 18:43:49|2020-11-03 19:19:38|
3| 2| 1| 2|2020-11-03 18:44:07|2020-11-03 19:19:38|
4| 0| 1| 1|2020-11-03 19:19:21|2020-11-03 19:25:21|
まず、NULL値の扱いについてpointの値でORDER BYをかけて検証してみる。
NULL値は0より小さい値として扱われる模様。
並び順はDESCだと末尾に、ASCだと先頭になる。
SELECT * FROM order_test ot ORDER BY ot.`point` DESC;
id|point|priority_1|priority_2|created |modified |
--|-----|----------|----------|-------------------|-------------------|
1| 3| 2| 4|2020-11-03 18:40:30|2020-11-03 19:19:38|
3| 2| 1| 2|2020-11-03 18:44:07|2020-11-03 19:19:38|
4| 0| 1| 1|2020-11-03 19:19:21|2020-11-03 19:25:21|
2| | 2| 3|2020-11-03 18:43:49|2020-11-03 19:19:38|
SELECT * FROM order_test ot ORDER BY ot.`point` ASC;
id|point|priority_1|priority_2|created |modified |
--|-----|----------|----------|-------------------|-------------------|
2| | 2| 3|2020-11-03 18:43:49|2020-11-03 19:19:38|
4| 0| 1| 1|2020-11-03 19:19:21|2020-11-03 19:25:21|
3| 2| 1| 2|2020-11-03 18:44:07|2020-11-03 19:19:38|
1| 3| 2| 4|2020-11-03 18:40:30|2020-11-03 19:19:38|
次に、条件を複数掛けしたときの挙動。
最初の指定値の並びで並び変える。それ以降は、その前の並び変えで同じ値の中で並び変える。
例ではpriority_1で並び変えて、priority_1が同じ値の中でpriority_2の値で並び替えている。
補足としては、指定の並び変えで並び替えた後は、基本は登録順で並ぶ。(別途要検証)
SELECT * FROM order_test ot ORDER BY ot.priority_1 DESC, ot.priority_2 ASC;
id|point|priority_1|priority_2|created |modified |
--|-----|----------|----------|-------------------|-------------------|
2| | 2| 3|2020-11-03 18:43:49|2020-11-03 19:19:38|
1| 3| 2| 4|2020-11-03 18:40:30|2020-11-03 19:19:38|
4| 0| 1| 1|2020-11-03 19:19:21|2020-11-03 19:25:21|
3| 2| 1| 2|2020-11-03 18:44:07|2020-11-03 19:19:38|
コメント