【问题标题】:MySQL get record count by hour, even the hours with no recordsMySQL按小时获取记录计数,甚至是没有记录的小时
【发布时间】:2014-03-17 02:13:13
【问题描述】:

我想按小时查询过去 24 小时内表中列值的平均值。即使在没有记录的几个小时内,我也无法显示结果(在这些情况下,我应该平均打印 0)

这是我目前所拥有的:

SELECT HOUR(time), AVG(score) FROM place_rvw WHERE time >= NOW() - INTERVAL 1 DAY AND place_id = 1 ORDER BY HOUR(time);

例如,现在(上午 12 点),我仅有的记录是晚上 9 点和晚上 10 点。因此,结果中只有两行。我希望它有 24 行(代表过去 24 小时的每一行),如果一个小时没有记录,则简单地显示平均值 0。

感谢任何形式的帮助。谢谢!

编辑 我按照 Stephan 的建议尝试了下面的查询,但它仍然显示相同的结果。理想的结果应该是所有 24 行代表每小时。有什么建议吗?

  SELECT za_hours.za_hour as hour, AVG(IFNULL(score,0)) as average_score
  FROM (
  SELECT 0 as za_hour
  UNION
  SELECT 1 as za_hour
  UNION
  SELECT 2 as za_hour
  UNION
  SELECT 3 as za_hour
  UNION
  SELECT 4 as za_hour
  UNION
  SELECT 5 as za_hour
  UNION
  SELECT 6 as za_hour
  UNION
  SELECT 7 as za_hour
  UNION
  SELECT 8 as za_hour
  UNION
  SELECT 9 as za_hour
  UNION
  SELECT 10 as za_hour
  UNION
  SELECT 11 as za_hour
  UNION
  SELECT 12 as za_hour
  UNION
  SELECT 13 as za_hour
  UNION
  SELECT 14 as za_hour
  UNION
  SELECT 15 as za_hour
  UNION
  SELECT 16 as za_hour
  UNION
  SELECT 17 as za_hour
  UNION
  SELECT 18 as za_hour
  UNION
  SELECT 19 as za_hour
  UNION
  SELECT 20 as za_hour
  UNION
  SELECT 21 as za_hour
  UNION
  SELECT 22 as za_hour
  UNION
  SELECT 23 as za_hour
) za_hours
LEFT JOIN place_rvw 
  ON za_hours.za_hour = HOUR(time)
  AND
  time >= NOW() - INTERVAL 1 DAY 
  AND place_id = 1 
GROUP BY
  za_hours.za_hour
ORDER BY za_hours.za_hour

【问题讨论】:

    标签: mysql sql database select


    【解决方案1】:

    1) 创建一个有 24 行的表,每行一个小时。

    2) 与您的表进行左外连接。

    解决方案如下所示: SQL fiddle

    由于过滤,您仍然没有得到结果

    【讨论】:

    • 是的,我按照斯蒂芬的建议尝试了这个,但它显示了相同的结果。设置 0 值的 IFNULL 函数也不起作用。
    • 谢谢。知道了。我刚刚将 where 子句条件添加到 LEFT JOIN 部分(请参阅我的帖子编辑)。
    • 我认为我的答案是被接受的;p
    【解决方案2】:

    你需要类似的东西:

    SELECT 
      za_hours.za_hour, 
      AVG(IFNULL(score,0)) 
    FROM (
      SELECT 0 as za_hour
      UNION
      SELECT 1 as za_hour
      ...
      SELECT 23 as za_hour
    ) za_hours
    LEFT JOIN place_rvw 
      ON za_hours.za_hour = HOUR(time)
    WHERE 
      time >= NOW() - INTERVAL 1 DAY 
      AND place_id = 1 
    GROUP BY
      za_hours.za_hour
    ORDER BY za_hours.za_hour
    

    za_hours 是一个包含所有小时 (0,1.. 24) 的 tmp 表,因此当您在某个小时内没有记录时,您仍然会有结果(即使它们为零)

    【讨论】:

    • 谢谢!这可能是解决方案。但是我可以问我如何确定该临时表中过去 24 小时的时间吗?例如,现在的时间是凌晨 2 点。因此,我应该只包括凌晨 3 点(昨天)直到这个小时。
    • @galibee 在临时表中您将始终拥有 24 小时...时间限制是通过将条件放在您已经拥有的 time 列上来进行的 time >= NOW() - INTERVAL 1 DAY
    • 知道了,我认为它可以工作,但它仍然显示相同的结果。
    • 找到了解决方案。我只是将 where 子句中的条件放在 LEFT JOIN 部分(检查我的帖子编辑)。再次感谢!
    【解决方案3】:

    您的 WHERE 语句阻止它显示包含 0 的行。在您的 WHERE 语句中使用 OR 来执行以下操作:OR time = 0

    【讨论】:

    • 行不包含0,该时间段没有行。
    • 啊我误解了那部分。
    • 感谢您的回答。我添加子句 AND place_id = 1 的原因是因为我只想显示具有该外键的结果。用 OR 代替 AND 会产生不正确的结果。
    【解决方案4】:

    尝试改变这个:

    WHERE 
      time >= NOW() - INTERVAL 1 DAY 
      AND place_id = 1 
    

    对此:

    WHERE 
      (time >= NOW() - INTERVAL 1 DAY
      or time is null)
      AND place_id = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多