Можно сравнить COUNT (*) из нескольких строк на MySQL? - PullRequest
2 голосов
/ 15 мая 2009

Привет. Я работаю над запросом, который использует схему ниже, чтобы выяснить, как часто пользователи выполняют поиск по компании (приложение в основном позволяло вам выполнять поиск по компании)

SEARCH_LOG
----------
date_of_search (DATETIME)
company_id (INT)


COMPANIES
---------
id (INT)
company_name (VARCHAR)

(there are more columns but these are the relevant ones)

Итак, я запускаю следующий запрос:

SELECT company_name,COUNT(*) FROM companies LEFT OUTER JOIN search_log ON search_log.company_id=companies.id GROUP BY companies.id

Это замечательно, так как возвращает каждую компанию и количество выполненных поисков, однако я хочу выразить эти цифры в процентах. Моя реакция на коленный рефлекс состояла в том, чтобы просто выполнить следующий запрос отдельно:

SELECT COUNT(*) FROM search_log

Получите этот результат и просто делите на стороне приложения, однако это кажется действительно неэффективным, и я хотел бы сделать все это в одном запросе, если это возможно (желательно без использования подзапроса), но не знаю, как получить эту информацию.

Буду признателен за любую помощь или руководство.

РЕДАКТИРОВАТЬ: Может быть, я не совсем понял, что я после. Вместо того, чтобы получать результаты, как:

COMPANY_NAME | COUNT(*)
-----------------------
CompanyA     | 1
CompanyB     | 3

Я бы лучше увидел:

COMPANY_NAME | COUNT(*)
-----------------------
CompanyA     | 25%
CompanyB     | 75%

Очевидно, что форматирование не так уж важно, так как 25,25%, 0,25 все пригодны для использования.

Ответы [ 6 ]

3 голосов
/ 15 мая 2009

Хотя это не единственный запрос, следующее решение сделает это в SQL с использованием переменной:

select @total:=count(*) from search_log;  
select company_id,count( * ) , count( * )/@total as percentage from search_log group by company_id;
2 голосов
/ 15 мая 2009

Я делал такие вещи с помощью представлений и пользовательских функций (хотя я не знаю, доступны ли функции в mysql). Если честно, лучше всего создать небольшое хранилище данных. Сообщать о таких вещах будет намного быстрее. Вы также сможете найти новые способы сообщения ваших данных.

Недостатком является то, что обычно вы не можете получить «живой» отчет. Обычно вы собираете все свои данные ночью. С другой стороны, вы можете посмотреть на тренды во времени таким образом.

Как правило, в час низкого трафика вы делаете снимок ваших данных. Затем вы будете мутировать их и вставлять в размерную модель. После этого все ваши отчеты очень просты! :)

Кроме этого, лучше всего использовать скалярную функцию или подзапросы.

1 голос
/ 15 мая 2009

Как насчет этого вместо

SELECT company_name,COUNT(*) FROM companies LEFT OUTER JOIN search_log ON search_log.company_id=companies.id GROUP BY companies.id

попробовать

SELECT company_name,(COUNT(*)/(select count(*) from search_log) * 100) as percent FROM companies LEFT OUTER JOIN search_log ON search_log.company_id=companies.id GROUP BY companies.id
1 голос
/ 15 мая 2009

Этот вопрос был задан ранее в несколько иной форме, и я не вижу решений, которые позволили бы избежать второго запроса - если вы хотите сделать все это в базе данных.

Если вы делаете это в своем приложении, вам на самом деле не нужно делать второй запрос. Просто переберите все результаты первого запроса и сложите итоги по каждой группе. Это должно дать вам «общий итог» без необходимости нажимать на БД вторым запросом.

Это, вероятно, заставит вас дважды повторить результаты - один раз, чтобы получить итоговое значение, второй раз, чтобы вычислить проценты. Но все же, вероятно, быстрее, чем делать второй запрос.

0 голосов
/ 25 августа 2009

Это запустит подзапрос только один раз и даст вам пропорции, которые вы ищете.

SELECT company_name, COUNT(*)/t.total FROM companies 
LEFT OUTER JOIN search_log ON search_log.company_id=companies.id
JOIN (SELECT count(*) as total FROM companies) AS t
GROUP BY companies.id
0 голосов
/ 15 мая 2009

Я всегда делал, какова была твоя реакция коленного рефлекса.

Во-первых, мне удобнее писать математику на стороне приложения. И во-вторых, я не знаю, насколько я доверяю математике MySQL.

Я не думаю, что делать count(*) вообще неэффективно.

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