MySQL中的查詢小技巧

數據表

  一個簡單的示例表,user_id爲用戶id外鍵,score爲用戶分數。
在這裏插入圖片描述

使用 CASE WHEN 自定義排序優先級

  用戶分數查詢系統中,首頁列表按照分數降序排列,即原本應是如下順序:
在這裏插入圖片描述
  出於人性化考慮,當用戶進入系統時,我們希望該用戶的所有得分都在最前面顯示,且不影響其他記錄的排序。這時可以用CASE WHEN來自定義排序的優先級。

  1. 寫法①:簡單CASE語句
-- WHEN語句中的值爲判斷條件,THEN語句中的值爲優先級(越大優先級越高)
SELECT * FROM demo ORDER BY CASE user_id WHEN 2 THEN 10 END DESC, score DESC;
  1. 寫法②:可搜索CASE語句
-- 相等判斷
SELECT * FROM demo ORDER BY CASE WHEN user_id = 2 THEN 10 END DESC, score DESC;
-- 範圍判斷
SELECT * FROM demo ORDER BY CASE WHEN (user_id > 1 AND user_id < 3) THEN 10 END DESC, score DESC;
-- 相似判斷
SELECT * FROM demo ORDER BY CASE WHEN user_id LIKE "%2%" THEN 10 END DESC, score DESC;
-- 包含判斷
SELECT * FROM demo ORDER BY CASE WHEN user_id IN (2) THEN 10 END DESC, score DESC;
-- 正則判斷
SELECT * FROM demo ORDER BY CASE WHEN user_id REGEXP '[2]' THEN 10 END DESC, score DESC;

  以上語句查詢結果均爲下圖:
在這裏插入圖片描述

實際上,CASE還有很多妙用,用在SELECT作用域、用在WHERE作用域、用在ORDER作用域,都是可以大展身手的好地方。

-- 添加查詢結果標記位,
SELECT id, user_id, score, CASE WHEN score > 90 THEN '優秀' WHEN score > 80 THEN '合格' ELSE '不合格' END AS level FROM demo ORDER BY score DESC;

在這裏插入圖片描述

-- 千人千面的判斷,用戶爲VIP時,只要80就算優秀
SELECT id, user_id, score, '優秀' AS level FROM demo WHERE CASE WHEN user_id in (2) THEN score > 80 ELSE score > 90 END ORDER BY score DESC;

在這裏插入圖片描述

使用 FIELD 自定義排序方式

  開發中或多或少會有這樣的需求,用戶定義了排序的方式,而且並不一定在邏輯上有序。以本博客爲例,我們需要按user_id 2 \rightarrow 3 \rightarrow 1的順序排列,且不影響分數倒序的基礎,此時可以使用FIELD來自定義排序方式。

-- 單列的自定義排序
SELECT * FROM demo ORDER BY FIELD(user_id, 2, 3, 1) ASC, score DESC;

-- 多列的自定義排序
SELECT * , CONCAT(score, user_id) as flag FROM demo ORDER BY FIELD(flag, "822", "812", "993", "893", "921", "751") ASC, created_at DESC

在這裏插入圖片描述

注意:實際上,FIELD(str, str1, str2, str3) 返回str在比較列表中的排位,不在則返回0

使用 IF ELSE

  IF函數也能定義一些方便的查詢,此處不做贅述。

SELECT id, user_id, score, IF(score > 90, '優秀', '其他') AS level FROM demo ORDER BY score DESC;

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章