搜尋

首頁  >  問答  >  主體

php - MySQL的排序並取得對應序號

現在需要實現這麼一個功能:對資料庫中的對應年齡的兒童的身高排序,並得到指定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 是什麼意思,查了一下大致知道是自定義命名賦值之類的,但是不清楚要準確該怎麼理解,還有出現的bc是什麼意思?

2.我要在該語句基礎上加一個條件,就是八歲兒童的身高排名,也就是要在第一條排序語句中加入where age equals 8 這句話應該加在哪裡? 我試過加在 from test 後面和其他幾個地方都報錯了,不知道該怎麼加。

困擾了一天了,希望資料庫的大蝦們幫忙解答一下這兩個問題,萬分感謝! ! !

过去多啦不再A梦过去多啦不再A梦2759 天前667

全部回覆(3)我來回復

  • 巴扎黑

    巴扎黑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,

    回覆
    0
  • phpcn_u1582

    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(*)就是排名

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦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

    回覆
    0
  • 取消回覆