首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 多欄位排序實戰:時間排序後置頂社區頭條的子查詢與 CASE WHEN 兩種寫法

     編輯:程式設計綜合問答

需求場景

文章列表先按建立時間 createTime DESC 排序,但同時間區間內,catName = '社區頭條' 的文章要置頂。

寫法一:子查詢 + 外層排序 (最佳回答)

SELECT * FROM (
    SELECT a.articleTitle, a.createTime, b.catName
    FROM t_zx_sqzx a
    JOIN t_zx_xiaoqu b ON a.catId = b.catId
    WHERE a.isHow = '1'
      AND a.communityId = '8'
      AND a.createTime BETWEEN '2015-08-30' AND '2015-09-02'
    ORDER BY a.createTime DESC
) t
ORDER BY 
    CASE WHEN t.catName = '社區頭條' THEN 0 ELSE 1 END,
    t.createTime DESC;

內層先按時間排序,外層用 CASE WHEN 將頭條置頂 (0 在前),次序再按時間。

寫法二:單層 ORDER BY 多鍵值 (效能更好)

SELECT a.articleTitle, a.createTime, b.catName
FROM t_zx_sqzx a
JOIN t_zx_xiaoqu b ON a.catId = b.catId
WHERE a.isHow = '1'
  AND a.communityId = '8'
  AND a.createTime BETWEEN '2015-08-30' AND '2015-09-02'
ORDER BY 
    CASE WHEN b.catName = '社區頭條' THEN 0 ELSE 1 END,
    a.createTime DESC;

無子查詢,優化器可直接使用 (catName, createTime) 複合索引。

索引建議

CREATE INDEX idx_sqzx_community_time ON t_zx_sqzx(communityId, isHow, createTime DESC);
CREATE INDEX idx_xiaoqu_catname ON t_zx_xiaoqu(catName);

分頁陷阱提醒

若需分頁 (LIMIT 20 OFFSET 40),必須在最外層套用 LIMIT,否則子查詢排序後再 LIMIT 會導致順序錯亂。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved