我的活動表中有以下資料。我想在頂部顯示那些 followup_date 從今天開始按升序排列的記錄,在 followup_date 是過去日期的那些記錄之后按升序顯示,然后是那些 followup_date 為空的記錄。
DROP TABLE IF EXISTS `activity`;
CREATE TABLE IF NOT EXISTS `activity` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type_id` int(11) NOT NULL,
`followup_date` date DEFAULT NULL,
`created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
--
-- Dumping data for table `activity`
--
INSERT INTO `activity` (`id`, `type_id`, `followup_date`, `created`) VALUES
(1, 1, '2022-03-22', '2022-03-24 18:51:23'),
(2, 1, '2022-03-23', '2022-03-24 18:51:23'),
(3, 1, '2022-03-24', '2022-03-24 18:51:58'),
(4, 1, '2022-03-25', '2022-03-24 18:51:58'),
(5, 1, '2022-03-26', '2022-03-24 18:52:21'),
(6, 1, '2022-03-13', '2022-03-24 18:52:21'),
(7, 1, NULL, '2022-03-24 18:54:15'),
(8, 1, NULL, '2022-03-24 18:54:15');
我嘗試使用下面的查詢,但不明白我將如何使用 ORDER BY CASE 陳述句來獲得下面提到的結果。
SELECT * FROM `activity` ORDER BY CASE WHEN followup_date IS NULL THEN 2 WHEN followup_date >= '2022-03-24' THEN 1 END ASC
電流輸出:

預期產出

我需要在上述查詢中進行哪些更改才能獲得預期輸出
uj5u.com熱心網友回復:
我將運算式移動到選擇串列中,以便我們可以在結果中看到它,但您可以將其保留在 ORDER BY 子句中:
SELECT CASE WHEN followup_date IS NULL THEN 2
WHEN followup_date < '2022-03-24' THEN 1
ELSE 0 END AS sort_bucket,
id, followup_date
FROM `activity`
ORDER BY sort_bucket ASC, followup_date ASC
輸出:
------------- ---- ---------------
| sort_bucket | id | followup_date |
------------- ---- ---------------
| 0 | 3 | 2022-03-24 |
| 0 | 4 | 2022-03-25 |
| 0 | 5 | 2022-03-26 |
| 1 | 6 | 2022-03-13 |
| 1 | 1 | 2022-03-22 |
| 1 | 2 | 2022-03-23 |
| 2 | 7 | NULL |
| 2 | 8 | NULL |
------------- ---- ---------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/448886.html
標籤:mysql 案子 sql-order-by
上一篇:MySQL:提取唯一日期
