【问题标题】:Count on mysql GROUP BY依靠 mysql GROUP BY
【发布时间】:2015-02-17 00:15:09
【问题描述】:

我想使用以下两个(简化的)表格来计算每个用户访问我网站的唯一天数:

Table: Users
+--------------+------------------+
| Field        | Type             |
+--------------+------------------+
| userid       | int(10)          |
| firstname    | varchar(50)      |
| lastname     | varchar(50)      |
+--------------+------------------+

Table: Visitors
+--------------+------------------+
| Field        | Type             |
+--------------+------------------+
| visitorid    | int(10)          |
| userid       | int(10)          |
| visitdate    | timestamp        |
+--------------+------------------+

首先我按DATE(visitdate) 分组以按日期对记录进行分组。 然后我按userid分组,统计每个用户访问的天数。

我的查询是:

SELECT count(userid) as count, userid, firstname, lastname FROM 
    (SELECT users.userid, firstname, lastname, DATE(`visitdate`) AS dateonly FROM 
    visitors JOIN users ON visitors.userid = users.userid 
    GROUP BY DATE(`visitdate`)) b 
GROUP BY userid ORDER BY count DESC

但是,当我简单地添加一个 WHERE 子句来限制用户 ID 时,这会得到一个不正确的计数。以下查询给出了单个用户的正确计数。

SELECT count(userid) as count, userid, firstname, lastname FROM 
    (SELECT users.userid, firstname, lastname, DATE(`visitdate`) AS dateonly FROM 
    visitors JOIN users ON visitors.userid = users.userid 
    WHERE users.userid = 167
    GROUP BY DATE(`visitdate`)) b 
GROUP BY userid ORDER BY count DESC

显然我弄错了 - 任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: mysql count group-by


    【解决方案1】:

    如果我理解你的问题,我认为这就是你想要的:

    SELECT u.userid, u.firstname, u.lastname, COUNT(DISTINCT CAST(v.visitdate AS DATE)) AS visits
    FROM users u
    LEFT JOIN visitors v ON v.userid = u.userid 
    GROUP BY u.userid, u.firstname, u.lastname
    

    这将向您显示每个用户的用户 ID、名字、姓氏和不同访问日期的计数(如果没有访问,则为 0,因为它使用左连接来包括访问者表中缺少项目的用户)。

    【讨论】:

    • 由于visitdatetimestamp 并且这是访问页面的日志,因此我需要首先对visitdate 进行分组,以便用户访问的每一天都有一个条目。这就是我的代码中group by 中的group by 的原因。
    • @mseifert 啊,我错过了;但我认为您可以将时间戳转换为日期以使其正确,我更改了查询,请尝试一下。
    • 这确实有效,谢谢。你能猜猜为什么我在原始问题中的两个陈述对userid = 167 产生不同的结果吗?我想找出逻辑中的错误来更好地理解mysql。
    • @mseifert 如果我猜你的第一个查询应该只返回一行,并且计数应用于整个集合;如果您从 group by 中省略列,这就是 MySQL 应该做的 - 但也许我误解了查询 - 我没有任何 MySQL 服务器可供测试。
    • 啊,解决方案是我在第一个查询中的Group By 中省略了userid。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多