乙個簡單的示例表,user_id為使用者id外來鍵,score為使用者分數。
使用者分數查詢系統中,首頁列表按照分數降序排列,即原本應是如下順序:
出於人性化考慮,當使用者進入系統時,我們希望該使用者的所有得分都在最前面顯示,且不影響其他記錄的排序。這時可以用case when
來自定義排序的優先順序。
寫法①:簡單case
語句
-- when語句中的值為判斷條件,then語句中的值為優先順序(越大優先順序越高)
select
*from demo order
bycase user_id when
2then
10end
desc
, score desc
;
寫法②:可搜尋case
語句
-- 相等判斷
select
*from demo order
bycase
when user_id =
2then
10end
desc
, score desc
;-- 範圍判斷
select
*from demo order
bycase
when
(user_id >
1and user_id <3)
then
10end
desc
, score desc
;-- 相似判斷
select
*from demo order
bycase
when user_id like
"%2%"
then
10end
desc
, score desc
;-- 包含判斷
select
*from demo order
bycase
when user_id in(2
)then
10end
desc
, score desc
;-- 正則判斷
select
*from demo order
bycase
when user_id regexp
'[2]'
then
10end
desc
, score desc
;
以上語句查詢結果均為下圖:
實際上,case還有很多妙用,用在select
作用域、用在where
作用域、用在order
作用域,都是可以大展身手的好地方。
-- 新增查詢結果標記位,
select id, user_id, score,
case
when score >
90then
'優秀'
when score >
80then
'合格'
else
'不合格'
-- 千人千面的判斷,使用者為vip時,只要80就算優秀
select id, user_id, score,
'優秀'
開發中或多或少會有這樣的需求,使用者定義了排序的方式,而且並不一定在邏輯上有序。以本部落格為例,我們需要按user_id 2 →\rightarrow
→ 3 →
\rightarrow
→ 1的順序排列,且不影響分數倒序的基礎,此時可以使用field
來自定義排序方式。
-- 單列的自定義排序
select
*from demo order
by field(user_id,2,
3,1)
asc, score desc
;-- 多列的自定義排序
注意:實際上,field(str, str1, str2, str3) 返回str在比較列表中的排位,不在則返回0
if
函式也能定義一些方便的查詢,此處不做贅述。
select id, user_id, score,
if(score >90,
'優秀'
,'其他')as
mysql查詢優化小技巧
1.開啟快取mysql show variables like query cache mysql set global query cache type 1 mysql set global query cache size 1024 1024 32注意 查詢快取存在判斷是嚴格依據select語句...
mysql中的小技巧
在長期的資料更新過程中,索引檔案和資料檔案,都將產生空洞,形成碎片 我們可以通過乙個 nop操作 不產生對資料實質影響的操作 來修改表。比如 表的引擎為 innodb,可以 alter table tablename engine innodb 也可以 optimize table tablenam...
mysql 查詢技巧
查出來的結果每一行顯示一條,中間以 號分隔。select from tablename limit 10 g mysql 隨機取資料 select from table name order by rand limit 5 二 mysql複製表資料到新錶的方法 1.mysql複製表結構及資料到新錶 ...