2011-04-15 114 views
8

說我有一個sqlite數據庫中有兩個字段的表:名稱和年齡。從sqlite表檢索排名

Bob|40 
Rob|50 
Zek|60 

如何查詢Zek的sqlite表,並確定他是最古老的?更一般地說,假設我擁有數百萬個姓名和年齡,並且我想要查詢特定條目,例如name =「Juju bear」,並且通過不同的字段查找條目的排名,例如, 「Juju熊」排名133455(按年齡)。

感謝,

科羅拉多

+4

我意識到你提供了一個簡化的例子 - 但存儲出生日期或年份,而不是年齡本身,並計算年齡。不要存儲年齡本身。如果我多次沒有看到這一點,我不會寫這個評論。 – Tim 2011-04-16 13:07:39

+0

好點,年齡的變化不是嗎? – 2011-04-16 16:11:39

回答

16

您可以使用子查詢來計算的人數與年齡較高,如:

select p1.* 
,  (
     select count(*) 
     from People as p2 
     where p2.age > p1.age 
     ) as AgeRank 
from People as p1 
where p1.Name = 'Juju bear' 
4

Andomar的回答是一個很好的,它應該幾乎肯定仍然是這個問題的選擇答案。這就是說......

我發現一個複雜的查詢我當時正在迅速成爲笨拙,當我試圖把它變成鞋拔子Andomar的解決方案,因此出於絕望,我嘗試使用類似下面的代碼:

CREATE TABLE DoughnutShopCountsByHood AS 
SELECT Neighborhood, COUNT(*) AS DoughnutShopCount FROM 
( <<crazy-set-of-painful-subqueries-removed>> ) 
GROUP BY Neighborhood ORDER BY DoughnutShopCount DESC; 

重要的部分是第一行中的「CREATE TABLE ... AS」部分。我曾計劃過這是第一步,但至少在Firefox的SQLite Manager中,我驚喜地發現,當我將可笑的長查詢轉儲到新表中時,RDBMS會自動添加一個索引列。這個列可以很好地作爲「等級」列加倍。

我意識到這是一個非常古老的問題,所以這個答案可能不會得到任何upvotes,但我張貼它,以防我的個人經驗可以幫助其他人面臨類似的挑戰。

再次感謝Andomar的原始答案 - 我想這對大多數人來說是最有幫助的。