2012-01-06 26 views
2

下面我有一個查詢,將得到一個網站最常見的用戶代理從用戶代理的表和IP地址的鏈接表:如何獲得一組使用mysql的總行數的百分比?

SELECT count(*) as num, string FROM `useragent_ip` 
left join useragents on useragent_id = useragents.id 
group by useragent_id 
having num > 2 
order by num desc, string 

有時它會告訴我像

25 Firefox 
22 IE 
11 Chrome 
3 Safari 
1 Spider 1 
1 Spider 2 
1 Spider 3 

我的問題是,如果有一種方法,因爲左邊的數字代表整體的百分比,並且會隨着時間增長,我可以讓sql語句的一部分顯示每個組的百分比嗎?所以,而不是使用having num > 2然後我可以做一些可以說,獲得總行數的百分比,而不是隻有行數?

回答

3

是,您可以:

select num, string, 100 * num/total as percent 
from (
    select count(*) as num, string 
    from useragent_ip 
    left join useragents on useragent_id = useragents.id 
    group by useragent_id) x 
cross join (
    select count(*) as total 
    from useragent_ip 
    left join useragents on useragent_id = useragents.id) y 
order by num desc, string; 

我刪除了having num > 2,因爲它似乎沒有什麼意義。

1

如果您group by條款之後添加with rollup,那麼你會得到一排,其中stringNULLnum是總所有的瀏覽器。然後,您可以使用該數字來生成百分比。

我真的不能想象一個單一的查詢做計算,並比使用with rollup更有效率。

+0

我認爲它會返回彙總行中最後找到的行的名稱而不是null。 (不確定) – 2012-01-06 05:05:20

+0

無法讓它與having子句一起工作,但對於一個很酷的命令而言,它是+1。 – cwd 2012-01-06 14:12:38