select uname, ***, salary, address, new_rank
from
( select uname, ***, salary, address,
# 如果臨時變數等於 address, 就+
1, 否則從1開始
if(@tmpaddress
= address,
@rank:=
@rank+1
,@rank:=
1) as new_rank,
@tmpaddress
:= address as tmpaddress #定義臨時變數
from (select t.*,
@tmpaddress:=
'',@rank:=
1 from person t order by address, salary desc) tb_a
) tb
where new_rank <=
3; #查詢前分組前3條資料
# where new_rank =
3; 查詢第三條資料
sql說明:
1、 首先將所有結果查出,並且給每個位址中的每條資料增加唯一識別符號(遞增),相當於將資料以 位址分組,每組中的資料都有乙個序號 new_rank,表示當前資料是當前分組中的第幾條;
2、 @tmpaddress := address 定義了乙個變數,變數的值為 address,沒次都將當前資料中的 address 賦值給 @tmpaddress 變數;
3、 語句解析:
if
(@tmpaddress
= address,
@rank:=
@rank+1
,@rank:=
1)# 如果 @tmpaddress 變數的值和當前 address相同,則序號加1,否則,序號從1開始重新計數
# @tmpaddress 據上一步說明,@tmpaddress 應該儲存的是上乙個 address 的值
查詢完成後 new_rank 中儲存的將是每條資料在每個(位址分組)中的唯一序號,然後過濾序號小於 3 的則是每個分組的前三個。
原始資料
參考:
mysql查詢第n到第m條資料
mysql如何指定查詢一張表的查詢結果,如最後5行記錄和最前5行記錄 我們以student表為例,裡面有三個字段 id,name,age,其中id為主健,為自增,裡面共有10條記錄,如下所示。mysql select from student id name age 1 li 11 2 zh 12 ...
mysql隨機查詢n條資料
遇到乙個業務需求是隨機查詢n條資料,一開始使用這種寫法 select from table order by rand limit n後來發現這種寫法的查詢效率極低,並且官方也不推薦使用。又經過查詢發現網上很多教程更靠譜的寫法如下 select from table as t1 join selec...
查詢表中第N條資料
如果表中的id是按順序排的那很簡單,相信大家都知道怎麼寫。現在問題是表中的id有些已經被刪除了,並不連貫,所以要查詢第n條資料就有些麻煩,習慣的sql寫法是這樣 select top 1 from select top n from testexam order by id desc a 應該是簡潔...