Dav*_*801 4 php mysql sql aggregation
我有一个像以下的mysql表:
id, visitorid, pageid
Run Code Online (Sandbox Code Playgroud)
当访问者访问网站时,它会将访问者ID和页面ID存储为一行.
我试图提取访问网站的访问者数量正好X次.(图表).所以有多少人只访问一页,有多少人访问2页...
到目前为止我有:
SELECT COUNT(visid),visid FROM vislog GROUP BY visid ORDER BY COUNT(visid) DESC
Run Code Online (Sandbox Code Playgroud)
但我不知道如何计算计数的下一部分.
是否可以作为mysql查询?
编辑:我已经添加了我的答案.
ype*_*eᵀᴹ 13
您可以将查询包装在另一个中:
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 ;
Run Code Online (Sandbox Code Playgroud)
或者(我认为将数字传递给图表更有意义),删除ORDER BY与放置相同的内容:
ORDER BY cnt ;
Run Code Online (Sandbox Code Playgroud)
一种方法是将此查询包装到另一个中:
SELECT COUNT(visid) FROM (
SELECT COUNT(visid) AS cvisid, visid
FROM vislog
GROUP BY visid
HAVING cvisid = 2) AS c
Run Code Online (Sandbox Code Playgroud)
但我认为你需要得到访问的直方图:这可以用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;
}
}
Run Code Online (Sandbox Code Playgroud)
或者使用MySQL本身:
SELECT cvisid,
COUNT(cvisid) AS cnt
FROM (
SELECT visid,
COUNT(visid) AS cvisid
FROM vislog
GROUP BY visid ) AS c
GROUP BY cvisid
Run Code Online (Sandbox Code Playgroud)
Dav*_*801 -11
我可以这样解决:
SELECT cnt, COUNT(cnt) FROM (
SELECT COUNT(visid) as cnt FROM vislog GROUP BY visid
) x GROUP BY cnt ORDER BY cnt ASC
Run Code Online (Sandbox Code Playgroud)
小事x很重要。
| 归档时间: |
|
| 查看次数: |
6023 次 |
| 最近记录: |