【问题标题】:Unique visitor query唯一访客查询
【发布时间】:2013-03-04 03:03:05
【问题描述】:

我需要找出每天唯一访客的数量,我有这样的数据库:

UID   clicks date
6046    9   2013-03-06
6449    7   2013-03-06
6450    41  2013-03-06
664     2   2013-03-07
2432    36  2013-03-07
3246    11  2013-03-07
6031    52  2013-03-07

现在我需要找到每天的唯一身份访问者数量。我发现这一点以及当天的点击次数。所以查询是这样的:

SELECT date,SUM(clicks) as new_clicks,COUNT(DISTINCT uID) as unique_clicks 
FROM uc_user 
WHERE date <='2013-03-15' GROUP BY date;

但是在这里我得到了错误的结果。计数与我使用

计算的相同间隔的计数不同
SELECT date, COUNT(DISTINCT uID ) AS unique_clicks
FROM uc_user
WHERE date <= '2013-03-15'
GROUP BY date
LIMIT 0 , 30

这些查询之间有什么区别,哪一个对于显示唯一身份访问者的数量是正确的?

其实我在 PHP 中的实际查询是这样的:

 SELECT date,SUM(clicks) as new_clicks,COUNT(uID) as unique_clicks 
 FROM currencyclick_user 
 WHERE date BETWEEN '$from' AND '$to' 
 GROUP BY date

 SELECT SUM(clicks) as total_new_clicks,
        COUNT(DISTINCT uID) as total_new_uniqueclicks  
 FROM currencyclick_user 
 WHERE date BETWEEN '$from' AND '$to'

但对于相同的范围,它显示不同的值。我的意思是总和查询显示的总数比我在第一个查询中添加计数得到的值错误。

【问题讨论】:

  • 您的用户 ID 计数在两个查询中看起来相同。它应该可以正常工作。您发布的查询是导致问题的实际查询,还是简化的查询?
  • 它应该像 2013-03-06 的 3 和 2013-03-07 的 4 因为所有的 id 都是唯一的。如果一个 UID 重复,则不应添加。也就是说,如果一个 664 的 ID 在 2013-03-06 中有条目,则不应考虑在接下来的任何一天计数
  • 我也发现了。看这里,sqlfiddle.com/#!2/8cfb2/3除非你更新记录
  • 你能显示上表的预期输出吗?

标签: mysql sql


【解决方案1】:

由于您更新了问题,因此问题最下方的两个查询非常不同,因为在第一个查询中,您按日期对记录进行了分组,而第二个查询则没有。第一个查询每天都会返回不同的记录,而第二个查询只会返回一条记录,因为您没有指定查询要对哪一列进行分组。

如果在不包含 GROUP BY 子句的语句中使用分组函数,则相当于对所有行进行分组。


更新 1

SELECT  SUM(new_clicks) totalClicks,
        SUM(unique_clicks) totalUnique
FROM
    (
        SELECT  date,
                SUM(clicks) as new_clicks,
                COUNT(uID) as unique_clicks 
        FROM    currencyclick_user 
        WHERE   date BETWEEN '$from' AND '$to' 
        GROUP   BY date
    ) subQ

【讨论】:

  • 其实我需要的是总和。我的意思是给定愤怒的唯一访问者总数,我该怎么做?
  • 好的,请参阅我的更新答案。你需要把它放在一个子查询中
【解决方案2】:

要查找某个范围内的唯一访问总数,请尝试此查询

SELECT  SUM(clicks) totalClicks,
    count(distinct UID) totalUnique
FROM
(
    SELECT UID,dtm,clicks
    FROM    currencyclick_user 
    WHERE   dtm BETWEEN '2013-03-06' AND '2013-03-07' 
) as allclicks

【讨论】:

  • 但我认为在子查询中,它选择了给定时期的访问者。所以它可能不会给出整个时期的唯一访问者计数。我的意思是这不会检查,如果 UID 在给定范围之前重复。
  • 是的内部查询没有,但外部查询给出了该期间的唯一成员。
猜你喜欢
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 2014-03-08
  • 2013-12-19
相关资源
最近更新 更多