【问题标题】:Count number of post and total like per user in a range of time in MySQL在 MySQL 的某个时间范围内计算每个用户的帖子数和总赞数
【发布时间】:2013-05-27 04:09:44
【问题描述】:

我有 2 张桌子:membersposts

在表members 中,每个用户都有USERID。在表posts 中,我有每个帖子的PID 和创建帖子的用户的USERID。每个帖子还有number_of_like,表示帖子被点赞的次数。

/*Table: posts*/
----------------

Field              Type              Null    Key     Default         Extra          
-----------------  ----------------  ------  ------  ----------  --------------
PID                bigint(20)        NO      PRI     (NULL)      auto_increment
USERID             bigint(20)        NO              0                         
number_of_like     int(10) unsigned  YES             0                         
number_of_comment  int(10) unsigned  YES             0                         
date_added         date              NO              0000-00-00

现在我想计算一下:在(DATE(date_added) > CURDATE() - INTERVAL 30 DAY) 的时间范围内,每个用户有多少个帖子以及他们的总点赞数。我按月和周计算。

我可以直接在查询中执行此操作吗?或者我必须使用 foreach 来计算每个用户,将其写入stats 表,然后在需要时从stats SELECT?

非常感谢任何帮助。谢谢你:)

更新

我需要列出所有用户,无论他们的帖子数是多少。

【问题讨论】:

    标签: mysql count


    【解决方案1】:

    是的,这可以做到。试试这样的:

    SELECT 
        U.USERID,
        COUNT(*),                <- total of posts per user
        SUM(A.number_of_like)    <- total of likes in these posts
    FROM users U
    LEFT JOIN posts A ON U.USERID = A.USERID
    WHERE ISNULL(A.USERID) 
        OR A.date_added > DATE_ADD(CURDATE(), INTERVAL -30 DAY)
    GROUP BY A.USERID;
    

    我使用DATE_ADD 进行日期计算,这里也可以使用其他日期函数。

    更新:

    在您提供了希望每个用户(不仅是有帖子的用户)的详细信息后,我更新了上面的 SQL 查询。

    【讨论】:

    • 你为什么使用带负 INTERVAL 的 DATE_ADD 而不是 DATE_SUB?
    • 我已经说过其他日期函数也可能在这里使用。在DATE_ADDDATE_SUB 之间进行选择并不重要,更多的是风格品味的问题。我个人认为 +/- 更容易阅读,因为您必须在其他任何地方在算术上下文中使用它们。
    • 感谢您的快速回复。我之前尝试过这个查询,但这只列出了实际发布至少 1 个帖子的用户(因此他们的 USERID 存在于表帖子中)。我需要列出所有用户,如果他们没有帖子,post_count 将为 0 ^^。我们需要在这里加入吗?
    • 对,您应该根据 users.id = posts.USERID 从用户到帖子进行左外连接
    • 抱歉,上面的问题没有特别提到这个细节。我更新了我的回复并添加了LEFT JOINWHERE-条件,所以现在应该返回每个用户ID,无论是否有帖子。
    猜你喜欢
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2017-09-15
    • 2023-03-11
    • 2012-05-11
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多