現在需要實現這麼一個功能:對資料庫中的對應年齡的兒童的身高排序,並得到指定ID兒童的身高排名。就是例如要查詢ID為9527的這名8歲兒童的身高在所有8歲兒童身高中的排名。資料庫學得不深,通常就進行增減改刪,所以不知道怎麼實作這個功能。
網上查詢了一些資料,就是先進行排序,生成行序號,然後返回對應兒童ID的序號,有個相似語句如下
select id,height,(@rowno:=@rowno+1) as rowno from test,(select (@rowno:=0)) b
order by height desc;
在此基础上再查询位置:
select rowno from (select id,height,(@rowno:=@rowno+1) as rowno from test,
(select (@rowno:=0)) b order by height desc) c where id = 9527;
我的問題是:
1.語句中的(@rowno:=@rowno+1)、(select (@rowno:=0)) 、b、C 是什麼意思,查了一下大致知道是自定義命名賦值之類的,但是不清楚要準確該怎麼理解,還有出現的b 和c是什麼意思?
2.我要在該語句基礎上加一個條件,就是八歲兒童的身高排名,也就是要在第一條排序語句中加入where age equals 8 這句話應該加在哪裡? 我試過加在 from test 後面和其他幾個地方都報錯了,不知道該怎麼加。
困擾了一天了,希望資料庫的大蝦們幫忙解答一下這兩個問題,萬分感謝! ! !
巴扎黑2017-05-16 13:13:51
1,得到9527的身高為 h
2,select count(0) from tb where age = 8 and height > h;
3,那麼9527的身高排名就是並列 count + 1,
phpcn_u15822017-05-16 13:13:51
不用那麼複雜,身高排名,如果從高到低排名,這麼計算:
a=身高字段
select count(*) from children where
age=8 and
a>=(select a from children where id=9527 );
count(*)就是排名
伊谢尔伦2017-05-16 13:13:51
mysql不支援rank方面的函數...在oracle, postgres等等比較強大的資料庫裡面可以很方便用row_number()實作
假如資料庫的column是id, age, height
select id, age, height,
row_number() over (partition by age order by height desc) as rn
from tb