mysql分段排序
需求:
一個活動表,記錄有開始時間欄位start_time,結束時間欄位end_time
需要分頁獲取全部欄位,總體上:
- 1.正在進行的活動排在最前部分(start_time < now < end_time)
這部分內部,按結束時間升敘,也就是即將結束的活動在前面。
- 2.即將開始的活動排在中間部分(now < start_time);
這部分內部,按開始時間升序,也就是即將開始的活動在前面。
- 3.已經過期的活動在最後部分(end_time < now)。
這部分內部,按結束時間降序,也就是最近結束的活動在前面。
分析:
根據條件,將(開始時間,結束時間)對映到一個整數序列,然後根據這個序列排序。
我找到的對映是這樣的:
首先確認一個“很大的數”Big。由於資料庫的時間範圍在1970-01-01 ~ 2038-01-19之間,值小於pow(2, 31),所以我確定的“很大的數”是Big=pow(2, 40);
對映
f(start_time, end_time)
{
if (start_time < now < end_time)
{
return end_time;
}
else if (now < start_time)
{
return start_time + pow(2, 40);
}
else if (end_time < now)
{
return (-1)*end_time + pow(2,41);
}
}
自己證明:end_time < start_time + pow(2, 40) < (-1)*end_time + pow(2,41)
然後,寫出的sql語句是:
SELECT id, start_time, end_time FROM lj_activity WHERE STATUS = 0 ORDER BY
IF (UNIX_TIMESTAMP(start_time)<=UNIX_TIMESTAMP(NOW()) AND UNIX_TIMESTAMP(NOW())<UNIX_TIMESTAMP(end_time),
UNIX_TIMESTAMP(end_time),
IF(UNIX_TIMESTAMP(NOW())<UNIX_TIMESTAMP(start_time),
UNIX_TIMESTAMP(start_time)+POW(2,40),
UNIX_TIMESTAMP(end_time)*(-1)+POW(2,41)
)
);
相關文章
- MySQL 對字串排序MySql字串排序
- MySQL入門——排序MySql排序
- MySQL自定義排序MySql排序
- MySQL中的排序MySql排序
- 從排序原理到MYSQL中的排序方式排序MySql
- 【分段傳輸】c#使用IAsyncEnumerable實現流式分段傳輸C#
- Oracle9i自動分段空間管理改善分段儲存Oracle
- MySQL Order BY 排序過程MySql排序
- mysql相同數值排序MySql排序
- MySQL-排序資料MySql排序
- mysql中文欄位排序MySql排序
- pycharm如何分段執行PyCharm
- Java RSA 分段加解密Java解密
- 分段函式 (sdut oj)函式
- MySQL:排序(filesort)詳細解析MySql排序
- MySQL實現分組排序MySql排序
- MySQL中的排序規則MySql排序
- mysql資料庫姓名排序MySql資料庫排序
- Windows記憶體管理-分段Windows記憶體
- C# RSA 分段加解密C#解密
- IT14將工資分段
- 程式儲存器的分段
- IP地址分段計算 (轉)
- oracle 分頁sql 分段查資料和分段求和 sql語句 和java程式碼OracleSQLJava
- MySQL order by 排序結果不正確MySql排序
- mysql字符集和字元排序MySql字元排序
- MySQL排序內部原理探祕MySql排序
- [MYSQL-5]排序檢索資料MySql排序
- MySQL 5.7 ORDER BY排序的優化MySql排序優化
- MySQL 按照指定的欄位排序MySql排序
- mysql資料去重和排序MySql排序
- Pycharm中分段執行程式碼PyCharm行程
- 共享記憶體分段問題記憶體
- MySQL 預設排序真的是按主鍵來排序的嗎MySql排序
- Oracle9i的自動分段空間管理改善了分段儲存的本質Oracle
- mysql自定義排序順序語句MySql排序
- Mysql 分組排序的sql寫法MySql排序
- 如何在mysql中實現自然排序MySql排序