Как я могу получить процент от общего числа строк с MySQL для группы? - PullRequest
3 голосов
/ 06 января 2012

ниже У меня есть запрос, который получит наиболее распространенные пользовательские агенты для сайта из таблицы пользовательских агентов и связанной таблицы IP-адресов:

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 тогда я мог бы сделать что-то, что скажет: получить процент от общего количества строк, а не только количество строк?

Ответы [ 2 ]

4 голосов
/ 06 января 2012

Да, вы можете:

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 голос
/ 06 января 2012

Если вы добавите with rollup после предложения group by, вы получите строку, где string - это NULL, а num - это сумма всех браузеров. Затем вы можете использовать это число для генерации процентов.

Я не могу представить, чтобы один запрос выполнял вычисления и был более эффективным, чем with rollup.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...