SQLite排序求助:最新录入记录置顶且同ID记录聚合排序
解决方案:按「最新核心记录+同用户紧随+其余倒序」排序
根据你的需求,我们需要实现一种分层排序逻辑:把最新录入的记录放在最前面,同用户名的记录紧跟其后,剩下的记录按录入时间倒序排列。以下是针对SQLite的实现方案:
方法1:使用CTE(清晰易读,推荐)
SQLite 3.8.3及以上版本支持公共表表达式(CTE),用它可以让逻辑更清晰:
WITH latest_record AS ( -- 获取最新录入的那条记录的用户名和最大S.no SELECT UserName, MAX(S.no) AS max_sno FROM your_table ) SELECT * FROM your_table ORDER BY -- 第一排序规则:核心层级划分 CASE -- 最新记录排在最前面 WHEN S.no = (SELECT max_sno FROM latest_record) THEN 0 -- 同用户名的记录排在核心层级之后 WHEN UserName = (SELECT UserName FROM latest_record) THEN 1 -- 其他记录排在最后 ELSE 2 END, -- 第二排序规则:同层级内按录入时间倒序(S.no从大到小) S.no DESC;
逻辑解释:
latest_recordCTE先定位到最新的那条记录,拿到它的UserName和最大的S.noORDER BY的CASE语句把数据分成三个层级:- 层级0:仅包含最新的那条记录,确保它在最顶端
- 层级1:所有和最新记录同
UserName的其他记录,紧跟在层级0之后 - 层级2:剩下的所有记录,排在最后
- 每个层级内部再按
S.no降序排列,保证同用户的记录也是从新到旧展示,其余记录同样遵循录入时间倒序
方法2:兼容旧版SQLite(无CTE写法)
如果你的SQLite版本较低不支持CTE,可以用嵌套子查询实现相同逻辑:
SELECT * FROM your_table ORDER BY CASE WHEN S.no = (SELECT MAX(S.no) FROM your_table) THEN 0 WHEN UserName = (SELECT UserName FROM your_table WHERE S.no = (SELECT MAX(S.no) FROM your_table)) THEN 1 ELSE 2 END, S.no DESC;
验证结果
用你提供的测试数据执行以上SQL,会得到完全符合期望的结果:
S.no | UserName | ID | OrderT 5 | Rec | 5 | 5 2 | Rec | 2 | 2 4 | Bul | 4 | 4 3 | Del | 3 | 3 1 | Ram | 1 | 1
内容的提问来源于stack exchange,提问作者user2536273
相关产品推荐
相关产品推荐

