萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL ORDER BY 置頂神技:ORDER BY \`id\` = 4 DESC 讓指定記錄秒上首位

電商分類頁需要「指定商品強制置頂」,傳統做法在應用層陣列操作,碼農累且易出錯。MySQL ORDER BY 支援布林運算式排序:ORDER BY \`goods_id\` = 4 DESC 讓符合條件的行排在最前,再配合次級排序完美解決置頂需求,零應用層改動、效能極佳。

核心語法

-- 基礎置頂:指定 ID 排最前
SELECT \`goods_id\` FROM \`sdb_goods\` 
ORDER BY \`goods_id\` = 4 DESC 
LIMIT 0, 30;

-- 進階:置頂後,其餘按 ID 升序
SELECT \`goods_id\` FROM \`sdb_goods\` 
ORDER BY \`goods_id\` = 4 DESC, \`goods_id\` ASC 
LIMIT 0, 30;

原理解析

  • \`goods_id\` = 4 是布林運算式,結果為 1 (真) 或 0 (假)
  • DESC 讓 1 (匹配行) 排在 0 (非匹配行) 前面
  • MySQL 將布林值視為整數 0/1 參與排序,完全符合直覺

效果演示

置頂需求示意圖

使用前:正常 ID 順序

使用後:ID=4 置頂

完善後:置頂 + 次級排序

延伸應用:多條件置頂、權重排序

-- 多個 ID 置頂,按指定順序
ORDER BY FIELD(goods_id, 4, 7, 2) DESC, goods_id ASC

-- 狀態置頂:推薦商品 > 新品 > 普通
ORDER BY 
  CASE WHEN is_recommended = 1 THEN 3 
       WHEN is_new = 1 THEN 2 
       ELSE 1 END DESC,
  goods_id ASC

-- 綜合權重:點擊率 * 0.7 + 轉化率 * 0.3
ORDER BY (click_rate * 0.7 + conversion_rate * 0.3) DESC

效能分析

  • 無索引支援:運算式排序無法使用索引,會產生 Using filesort
  • 小表/分頁首頁:資料量 < 10 萬、配合 LIMIT 30,filesort 開銷可忽略
  • 大表/深分頁:考慮應用層組裝、物化視圖、或增加 sort_weight 欄位建立索引

避坑指南

  • 別寫成 ORDER BY goods_id = 4, goods_id ASC (預設 ASC,置頂會沉底)
  • 記得加 DESC 讓真值 (1) 排前面
  • 複合排序:置頂條件放最前,次級排序依序排後
MySQL ORDER BY 接受任意運算式,布林值 0/1 排序是「置頂」、「狀態優先」、「多維權重」的瑞士刀。下次產品經理要「這個商品置頂」,別再寫 PHP 陣列操作了,一條 SQL 搞定,優雅又高效。
copyright © 萬盛學電腦網 all rights reserved