網上找的乙個比較齊全的解釋案例,拿來記錄一下
① := 與 = 的區別
:= 賦值的意思。在set update select 中表示賦值的意思,用的比較少一般都用=,但是在用變數實現行號時(比如本文標題獲取排列序號),一定要用:=。
= 等於的意思,只有當set 和 update時,和:=的意思是一樣的,表示賦值,其餘情況都是等於的意思。
② 使用者變數 @
@rank 是對乙個叫rank的引數進行賦值。對使用者變數賦值有兩種方式,一種直接用"="另一種用":="。其區別在於使用set命令對使用者變數賦值時,兩種方式都可以使用;當使用select語句對使用者變數進行賦值時,只能使用「:=」方式,因為在select語句中,「=」被看做是比較操作符。
1、根據某欄位按序排列並獲取排序號。(當訪問量相同的時候,按正常順序,繼續排序)
select a.*,@rank:=@rank + 1as rank_no或from (
select *from `logs`
where log_created> "2017-09-01"order by count desc
) a, (select @rank:= 0) b
set @rank= 0;結果展示:select a.log_id,a.log_created,a.count,@rank:=@rank + 1as rank_no
from (
select *from `logs`
where log_update > "2017-09-01"order by count desc
) a;
踩坑:注意這裡的a 和 b 的表別名,不取的話會報sql異常哦
2、根據某欄位按序排列獲取排序號,且當該字段的值存在多個相同的記錄時,則相同值排序號相同。
set @rank = 0 ,@rowtotal :=null;踩坑:a.count,後面的,不可少select
a.log_id, a.log_created, a.count,
case
when @rowtotal =a.count then
@rank
when @rowtotal :=a.count then
@rank := @rank + 1end as rank_no
from
(select *from `logs`
where log_update > "2017-09-01"order by count desc
) a
結果展示:
) a上面的sql裡又增加了乙個引數sart,表示當前每次相同的個數,(同時還增加了rowtotal1,用於區別之前的roetotal,因為在這段sql中rowtotal在執行期間已被多次賦值,不適合做sart的比較引數)下一組記錄,將在之前的排名上加上此引數就表示,下一組記錄的排序編碼。
結果展示:
關於排序後原序號問題
乙個陣列的數,排序後要求其原序號 方法一 如果陣列總共有小於1000個數 所以給每個ti都 1001,在加上當前序號 可以保證排序的時候序號不干擾排序 又可以方便輸出序號 只需mod1001輸出序號,1001 輸出值 int num a i 1001 序號 int sum a i 1001 值樣例 ...
mysql分組排序加序號
參照 一 需求 新加乙個sort 字段,初始值為1,按照parentid分組新增sort值。根據原資料的parentid,postime排序,不同parentid值,sort 值從1開始重新增加 二 實現 1 update co test ast12 set sort 3 select 4t2.i ...
mysql先排序後判斷 mysql 排序後在查詢
今天寫sql 的時候,遇到乙個問題,有乙個圖書表和乙個章節表 book chapter 我需要隨機五本書,並且獲取這五本書的最新章節和標題 rank代表多少章 我的sql是 select t.from select b.c.rank,c.title from book b inner join ch...