文章列表先按建立時間 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 在前),次序再按時間。
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 會導致順序錯亂。