У меня таблица mysql:
id, visitorid, pageid
Когда посетитель попадает на сайт, он хранит идентификатор своего посетителя и идентификатор страницы в строке.
Я пытаюсь извлечь количество посетителей, попавших на сайт ровно в X раз. (для диаграммы). поэтому сколько посетителей посещают только одну страницу, сколько посещают 2 страницы …
до сих пор я имею:
SELECT COUNT(visid),visid FROM vislog GROUP BY visid ORDER BY COUNT(visid) DESC
Но я не знаю, как сделать следующую часть подсчета подсчетов.
Можно ли сделать запрос mysql?
Изменить: я добавил свой ответ .
Вы можете обернуть свой запрос внутри другого:
SELECT cnt AS page_visits , COUNT(*) AS number_of_visitors FROM ( SELECT COUNT(*) AS cnt --- use: COUNT(DISTINCT page_id) --- for a different count FROM vislog GROUP BY visid ) AS grp GROUP BY cnt ORDER BY number_of_visitors ;
или (я полагаю, это имеет смысл для передачи чисел на диаграмму), удалите ORDER BY
который совпадает с положением:
ORDER BY cnt ;
Один из способов сделать это – обернуть этот запрос в другой:
SELECT COUNT(visid) FROM ( SELECT COUNT(visid) AS cvisid, visid FROM vislog GROUP BY visid HAVING cvisid = 2) AS c
Но я думаю, вам нужно получить гистограмму посещений: это можно сделать с помощью PHP (при условии, что запрос такой же, как и в вопросе):
$results = array(); // query preparation skipped, as it's obviously done by the OP himself while ($row = $sth->fetch()) { $count = $row['cvisid']; if (isset($results[$count])) { $results[$count]++; } else { $results[$count] = 1; } }
Или с самой MySQL:
SELECT cvisid, COUNT(cvisid) AS cnt FROM ( SELECT visid, COUNT(visid) AS cvisid FROM vislog GROUP BY visid ) AS c GROUP BY cvisid
Попробуйте использовать следующий запрос
SELECT COUNT(a.page_visits) AS no_of_visitors, a.page_visits AS page_count FROM( SELECT COUNT(DISTINCT pageid) AS page_visits FROM vislog GROUP BY visid) AS a GROUP BY a.page_visits;
Надеюсь, поможет…
Raina77ow (2-й ответ) вернул чистое решение в своем третьем блоке кода
SELECT cvisid, COUNT(cvisid) AS cnt FROM ( SELECT visid, COUNT(visid) AS cvisid FROM vislog GROUP BY visid ) AS c GROUP BY cvisid
Спасибо
Я мог бы решить это так:
SELECT cnt, COUNT(cnt) FROM ( SELECT COUNT(visid) as cnt FROM vislog GROUP BY visid ) x GROUP BY cnt ORDER BY cnt ASC
Маленький x
важен.