電商分類頁需要「指定商品強制置頂」,傳統做法在應用層陣列操作,碼農累且易出錯。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 (非匹配行) 前面



-- 多個 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 filesortLIMIT 30,filesort 開銷可忽略sort_weight 欄位建立索引ORDER BY goods_id = 4, goods_id ASC (預設 ASC,置頂會沉底)DESC 讓真值 (1) 排前面MySQL ORDER BY 接受任意運算式,布林值 0/1 排序是「置頂」、「狀態優先」、「多維權重」的瑞士刀。下次產品經理要「這個商品置頂」,別再寫 PHP 陣列操作了,一條 SQL 搞定,優雅又高效。