sql語句查詢排名
思路:有點類似迴圈裡面的自增一樣,設定乙個變數並賦予初始值,迴圈一次自增加1,從而實現排序;
mysql裡則是需要先將資料查詢出來並先行按照需要排序的字段做好降序desc,或則公升序asc,設定好排序的變數(初始值為0):
a>.將已經排序好的資料從第一條依次取出來,取一條就自增加一,實現從1到最後的乙個排名
b>.當出現相同的資料時,排名保持不變,此時則需要再設定乙個變數,用來記錄上一條資料的值,跟當前資料的值進行對比,如果相同,則排名不變,不相同則排名自增加1
c.當出現相同的資料時,排名保持不變,但是保持不變的排名依舊會占用乙個位置,也就是類似於(1,2,2,2,5)這種排名就是屬於中間的三個排名是一樣的,但是第五個排名按照上面一種情況是(1,2,2,2,3),現在則是排名相同也會佔據排名的位置
準備資料(使用者id,分數):
create table `sql_rank` (`id` int(11) unsigned not null auto_increment,`user_id` int(11) unsigned not null,`score` tinyint(3) unsigned not null,`add_time` date not null,primary key (`id`)) engine=innodb default charset=latin1;
插入資料:
insert into sql_rank (user_id, score, add_time)values(100, 50, '2016-05-01'),(101, 30, '2016-05-01'),(102, 20, '2016-05-01'),(103, 60, '2016-05-01'),(104, 80, '2016-05-01'),(105, 50, '2016-05-01'),(106, 70, '2016-05-01'),(107, 85, '2016-05-01'),(108, 60, '2016-05-01')
當前資料庫資料:
一、sql1{不管資料相同與否,排名依次排序(1,2,3,4,5,6,7.....)}
select
obj.user_id,obj.score,@rownum := @rownum + 1 as rownum
from
select
user_id,
score
from
`sql_rank`
order by
score desc
) as obj,
(select @rownum := 0) r
執行的結果如下圖:
可以看到,現在按照分數從1到9都排好序了,但是有些分數相同的使用者排名卻不一樣,這就是接下來要說的第二種sql
二、sql2{只要資料有相同的排名就一樣,排名依次排序(1,2,2,3,3,4,5.....)}
select
obj.user_id,
obj.score,
case
when @rowtotal = obj.score then
@rownum
when @rowtotal := obj.score then
@rownum :=@rownum + 1
when @rowtotal = 0 then
@rownum :=@rownum + 1
end as rownum
from
select
user_id,
score
from
`sql_rank`
order by
score desc
) as obj,
(select @rownum := 0 ,@rowtotal := null) r
這時候就新增加了乙個變數,用於記錄上一條資料的分數了,只要當前資料分數跟上一條資料的分數比較,相同分數的排名就不變,不相同分數的排名就加一,並且更新變數的分數值為該條資料的分數,依次比較
如下圖結果:
跟第一條sql的結果相對比你會發現,分數相同的排名也相同,並且最後一名的名次由第9名變成了第7名;
如果你需要分數相同的排名也相同,但是後面的排名不能受到分數相同排名相同而不佔位的影響,也就是哪怕你排名相同,你也佔了這個位置(比如:1,2,2,4,5,5,7....這種形式的,雖然排名有相同,但是你佔位了,後續的排名根據佔位來排)
三、sql2{只要資料有相同的排名就一樣,但是相同排名也佔位,排名依次排序(1,2,2,4,5,5,7.....)}
此時需呀再增加乙個變數,來記錄排序的號碼(自增)
select
obj_new.user_id,
obj_new.score,
obj_new.rownum
from
select
obj.user_id,
obj.score,
@rownum := @rownum + 1 as num_tmp,
@incrnum := case
when @rowtotal = obj.score then
@incrnum
when @rowtotal := obj.score then
@rownum
end as rownum
from
select
user_id,
score
from
`sql_rank`
order by
score desc
) as obj,
select
@rownum := 0 ,@rowtotal := null ,@incrnum := 0
) r) as obj_new
上面sql執行的結果如下:
結果集中分數相同的,排名相同,同時它也佔據了那個位置,中間的乙個資料過程本人截圖了,請往下看(跟上圖做對比你就明白了):
原文:
mysql查詢字段排序 mysql 排序查詢字段
mysql 排序查詢字段 閱讀 504 排序查詢 語法 select 查詢欄位1 from 表 where 篩選條件 order by 要排序欄位2 asc公升序 desc 降序,要排字段3 asc公升序 desc降序 如果不寫預設為公升序 案例 查詢員工資訊,要求工資從高到低排序 select f...
mysql統計查詢並查詢字段
select count 1 ifvote d.voteitemid from tp votedetail d where d.fgsid and d.voteid 943306615853940736 and d.personid 011217033621526565 order by d.vot...
mysql查詢字段轉型 mysql轉型
1 將int 轉為varchar經常用 concat函式,比如concat 8,0 得到字串 80 2 將varchar 轉為int 用 cast a as signed a為varchar型別的字串 總結 型別轉換和sql server一樣,就是型別引數有點點不同 cast as 型別 conve...