首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 自定義排序利器:ORDER BY FIELD() 函數實戰指南

     編輯:MySQL 資料庫相關知識

業務常需按非字母/數值順序排序,如訂單狀態:3-已發貨、4-已完成、0-待付款、2-已取消、1-處理中。MySQL FIELD() 函數完美解決此類需求。

語法與示例

SELECT * FROM orders
ORDER BY FIELD(status, 3, 4, 0, 2, 1);

參數說明

  • status:排序依據欄位
  • 3, 4, 0, 2, 1:期望的排序優先級序列,值越靠前優先級越高

執行邏輯

  1. MySQL 計算每行 status 在列表中的位置索引(從 1 開始)
  2. 未在列表中的值返回 0,排在最後
  3. 按索引值升序排序

進階用法

1. 字串值排序

ORDER BY FIELD(priority, 'high', 'medium', 'low')

2. 結合次要排序

ORDER BY FIELD(status, 3, 4, 0, 2, 1), create_time DESC

3. 在 GROUP BY 中應用

SELECT status, COUNT(*)
FROM orders
GROUP BY status
ORDER BY FIELD(status, 3, 4, 0, 2, 1);

效能提示

  • FIELD() 不會使用索引,大表建議:
  • 方案 A:應用層排序(查出主鍵 ID 後按順序 IN 查詢)
  • 方案 B:增加 sort_order 列,維護排序權重,走索引排序
  • 方案 C:小結果集(< 1萬行)直接使用 FIELD() 影響可忽略

兼容性

MySQL 專有函數,MariaDB 完整支援。PostgreSQL 可用 CASE WHEN 或 array_position() 替代;SQL Server 使用 CHARINDEX 或 CASE;Oracle 使用 DECODE 或 CASE。

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