-1

我需要一些帮助来获取每个成员每天发布的平均评论。我想使用 mysql 查询而不是在 php 中使用多个查询和计算来获取它。

这些是表及其字段:

  1. 会员
    • 数量(主要)
    • createdDate(时间戳)
  2. 帖子
    • 数量(主要)
    • createdDate(时间戳)
    • 成员编号
  3. 注释
    • 数量(主要)
    • createdDate(时间戳)
    • 成员编号
    • 帖子数

是否可以使用单个查询或最少的查询获得这样的结果:

+--------------+------------------------+
|  member_num  |  avg_comments_per_day  |
+--------------+------------------------+
|  5           |  10                    |
+--------------+------------------------+
|  24          |  7                     |
+--------------+------------------------+
|  33          |  5                     |
+--------------+------------------------+
|  8           |  1                     |
+--------------+------------------------+
|  9           |  1                     |
+--------------+------------------------+

任何帮助将不胜感激。谢谢!

4

3 回答 3

2

你可以写:

SELECT member_num,
       COUNT(1) / COUNT(DISTINCT CAST(createdDate AS DATE)) AS avg_comments_per_day
  FROM comments
 GROUP
    BY member_num
;

这将给出每个用户的评论总数除以该用户发布任何评论的总天数。(这似乎是“平均”的最简单概念。如果您想要不同的东西,请澄清。)

(免责声明:未经测试。)

于 2013-04-12T00:04:59.310 回答
0

为此,您需要有一个表格,其中包含您可以加入的所有可能日期。所以像:

dates table
--------------

date
2001-01-01
2001-01-02
...
2030-12-31

显然,您可以根据需要调整开始日期和结束日期。你需要这个的原因是你需要有一种方法来计算用户有 0 条评论的日期,这些评论不会显示在你的评论表中。

然后,您需要将此表与您的评论表连接起来:

SELECT
  c.member_num AS `member`,
  d.`date` AS `date`,
  COUNT(c.num) AS `count`
FROM dates AS d
LEFT OUTER JOIN comments AS c
  ON d.`date` = DATE(c.createdDate)
WHERE d.`date` BETWEEN '????-??-??' AND '????-??-??'
GROUP BY `member`, `date`

请注意,我在此处添加了日期范围,因此您可以仅计算您感兴趣的时间段内的平均值。如果不这样做,您将在日期表中获得所有日期的平均值。当然,这只会让您获得一部分。您仍然需要对这些信息进行平均,因此在最终查询中使用上述查询作为子选择:

SELECT
    `member`,
    AVG(`count`) AS `daily_average`
FROM
    (SELECT
      c.member_num AS `member`,
      d.`date` AS `date`,
      COUNT(c.num) AS `count`
    FROM dates AS d
    LEFT OUTER JOIN comments AS c
      ON d.`date` = DATE(c.createdDate)
    WHERE d.`date` BETWEEN '????-??-??' AND '????-??-??'
    GROUP BY `member`, `date`) AS `comment_counts`
GROUP BY `member`

当然,这个查询的性能会很差,因为您不会在评论和日期之间的连接上使用索引。如果您需要定期执行此查询,我的建议是实际构建一个表,您可以在其中正确更新评论计数统计信息。

于 2013-04-12T00:11:08.603 回答
0

ruakh 或 mike 的方法应该适用于您的情况。

但是您应该考虑将这些信息存储在单独的表格中,您可以在每条评论或每天一次(或两者)更新该表格。

假设一个用户每天写 10 条帖子,那么每年有 3650 条评论,在网站上停留 10 年(或更短时间)后,您有来自该用户的 365000 条评论。在 rune-time 上计算每天的平均评论可能会增加计算时间,特别是如果您必须每天为很多用户执行多次。

因此,每次您需要数据时,不必计算每天的平均评论数,然后只需有一个单独的表

userId
avgComments

获取单个索引比每次需要数据时都进行计算要高效得多。

于 2013-04-12T00:12:43.720 回答