Mysql將查詢後的資料進行排名的SQL語句

2021-08-20 01:51:01 字數 3749 閱讀 8934

資料測試表

表名test

需求:這是一張店鋪的虛擬表,id為店鋪id,user_id為該店鋪的發展人,現需要對user_id進行分組查詢每個user下共有多少家店鋪,並對這個資料進行排名

思路:有點類似迴圈裡面的自增一樣,設定乙個變數並賦予初始值,迴圈一次自增加1,從而實現排序;

mysql裡則是需要先將資料查詢出來並先行按照需要排序的字段做好降序desc,或則公升序asc,設定好排序的變數(初始值為0):

a>.將已經排序好的資料從第一條依次取出來,取一條就自增加一,實現從1到最後的乙個排名

b>.當出現相同的資料時,排名保持不變,此時則需要再設定乙個變數,用來記錄上一條資料的值,跟當前資料的值進行對比,如果相同,則排名不變,不相同則排名自增加1

c.當出現相同的資料時,排名保持不變,但是保持不變的排名依舊會占用乙個位置,也就是類似於(1,2,2,2,5)這種排名就是屬於中間的三個排名是一樣的,但是第五個排名按照上面一種情況是(1,2,2,2,3),現在則是排名相同也會佔據排名的位置

首先,我們先要把進行排名前的資料查詢出來,這很簡單

[sql] 

view plain

copy

"font-size:18px;"

>

select

user_id,  

count

(*) 

asquantity  

from

test  

group

byuser_id  

order

byquantity

結果如下:

下面,就需要對上面的資料進行排名了

現在有三種排序方法,依次來舉例

一、不管資料相同與否,排名依次排序(1,2,3,4,5,6,7.....)

[sql] 

view plain

copy

select

a.user_id,  

a.quantity,  

@rownum := @rownum + 1 as

rank  

from

(  select

user_id,  

count

(*) 

asquantity  

from

test  

group

byuser_id  

order

byquantity  

) as

a,  

(select

@rownum := 0) r  

結果如下:

這樣子算是排序完成了,但是還會有乙個缺點,拿上面資料來說,前兩條和最後兩條資料的quantity值相等,誰在前誰在後就不好說了,所以有了下面的方法

二、只要資料有相同的排名就一樣,排名依次排序(1,2,2,3,3,4,5.....)

[sql] 

view plain

copy

select

a.user_id,  

a.quantity,  

case

when

@rowtotal = a.quantity 

then

@rownum  

when

@rowtotal := a.quantity 

then

@rownum :=@rownum + 1  

when

@rowtotal = 0 

then

@rownum :=@rownum + 1  

endas

rank  

from

(  select

user_id,  

count

(*) 

asquantity  

from

test  

group

byuser_id  

order

byquantity  

) as

a,  

(select

@rownum := 0 ,@rowtotal := 

null

) r  

這時候就新增加了乙個變數,用於記錄上一條資料的記錄了,只要當前資料記錄跟上一條資料的記錄比較,相同數量的排名就不變,不相同數量的排名就加一,並且更新變數的分數值為該條資料的分數,依次比較

結果如下:

如果你需要數量相同的排名也相同,但是後面的排名不能受到數量相同排名相同而不佔位的影響,也就是哪怕你排名相同,你也佔了這個位置(比如:1,2,2,4,5,5,7....這種形式的,雖然排名有相同,但是你佔位了,後續的排名根據佔位來排)於是

三、只要資料有相同的排名就一樣,但是相同排名也佔位,排名依次排序(1,2,2,4,5,5,7.....)

[sql] 

view plain

copy

select

new.user_id,  

new.quantity,  

new.rank  

from

(  select

a.user_id,  

a.quantity,  

@rownum := @rownum + 1 as

num_tmp,  

@incrnum := case

when

@rowtotal = a.quantity 

then

@incrnum  

when

@rowtotal := a.quantity 

then

@rownum  

endas

rank  

from

(  select

user_id,  

count

(*) 

asquantity  

from

test  

group

byuser_id  

order

byquantity  

) as

a,  

(  select

@rownum := 0 ,@rowtotal := null

,@incrnum := 0  

) r  

) as

new  

結果如下:

方法介紹完了,最後把三個排序結果放在一起對比一下

Mysql 將資料進行備份與還原

二 還原資料庫 1.資料的介紹 在運算元據庫時,難免會發生一些意外造成資料丟失。例如,突然停電 管理員的操作失誤都可能導致資料的丟失。為了確保資料的安全,需要定期對資料庫進行備份,這樣,當遇到資料庫中資料丟失或者出錯的情況,就可以將資料進行懷原,從而最大限度地降低損失。這段話是課本上說的,而我想說特...

MySQL 對JSON資料進行查詢

注意 用json型別的話 1 json列儲存的必須是json格式資料,否則會報錯。2 json資料型別是沒有預設值的。1 首先我們看到資料表中,form value 一列是josn格式存在的,又想通過其中的一組或者幾組鍵值對來進行查詢。2 通過以下語句就可以通過key,value來進行查詢了,如果多...

使用python將mysql的查詢資料匯出到檔案

mysql官方提供了很多種connector,其中包括python的connector。直接安裝即可。在python中 1.連線 import mysql.connector cnx mysql.connector.connect user scott password tiger host 127...