【问题标题】:Mysql result hourly dataMysql结果每小时数据
【发布时间】:2023-03-11 00:16:02
【问题描述】:

我正在尝试计算每小时分组的条目。 我在不同的网站和这里找到了一些有用的信息:MySQL Group By Hours

但结果不是我所期望的。 使用以下代码,我得到:

SELECT   CONCAT(Hour, ':00-', Hour+1, ':00') AS Hours,
     COUNT(`usage_time`) AS `usage` FROM `usage`
  RIGHT JOIN (
                   SELECT  0 AS Hour
         UNION ALL SELECT  1 UNION ALL SELECT  2 UNION ALL SELECT  3
         UNION ALL SELECT  4 UNION ALL SELECT  5 UNION ALL SELECT  6
         UNION ALL SELECT  7 UNION ALL SELECT  8 UNION ALL SELECT  9
         UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
         UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15
         UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18
         UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21
         UNION ALL SELECT 22 UNION ALL SELECT 23
  )      AS AllHours ON HOUR(`usage_time`) = Hour

WHERE `usage_function` LIKE 'PlayedWholeSong' AND `usage_date` = DATE_SUB(CURDATE(), INTERVAL 0 DAY) OR `usage_time` IS NULL
GROUP BY Hour
ORDER BY Hour

结果:

Hours       usage
2:00-3:00   0
4:00-5:00   6
6:00-7:00   2
8:00-9:00   3
9:00-10:00  20
10:00-11:00 1
14:00-15:00 14
15:00-16:00 1
16:00-17:00 32
17:00-18:00 10

由于这些是今天的参赛作品,我在 19:00 之后没有任何参赛作品。 此外,我没有看到 00:00 - 01:00、03:00 - 04:00 的条目,还有其他几个条目丢失。 但我确实想每 24 小时显示一个列表和结果,即使什么都没有。 字符串是结果在 02:00 - 03:00 之间显示 0。 我今天学到了很多关于 mysql 的知识,但没有什么能解决我的问题。

我希望你能学到一些东西,不一定是代码,一个方向会很棒。

【问题讨论】:

  • 您希望如何管理null 的使用时间?
  • 我建议尽可能多地在数据库中做,你最好在数据库中做一个标准的select hour(usage_time), ... group by hour(usage_time),然后在你的客户端填充“洞”显示逻辑。另外,你的 where 子句需要工作。你已经用或链接了 2 个和,并且没有括号来告诉 mysql 如何执行逻辑。是(a and b) or c,还是a and (b or c)

标签: mysql date time


【解决方案1】:

我个人更喜欢LEFT JOIN 而不是RIGHT JOIN。这样您就可以在您的JOIN 中添加您的WHERE 标准,并且它不会限制您的结果。试试这个:

SELECT   CONCAT(Hour, ':00-', Hour+1, ':00') AS Hours,
     COUNT(`usage_time`) AS `usage` 
FROM 
   (
         SELECT  0 AS Hour
         UNION ALL SELECT  1 UNION ALL SELECT  2 UNION ALL SELECT  3
         UNION ALL SELECT  4 UNION ALL SELECT  5 UNION ALL SELECT  6
         UNION ALL SELECT  7 UNION ALL SELECT  8 UNION ALL SELECT  9
         UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
         UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15
         UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18
         UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21
         UNION ALL SELECT 22 UNION ALL SELECT 23
  )      AS AllHours 
      LEFT JOIN `usage` ON HOUR(`usage_time`) = Hour 
           AND `usage_function` LIKE 'PlayedWholeSong' 
           AND `usage_date` = DATE_SUB(CURDATE(), INTERVAL 0 DAY) 
GROUP BY Hour
ORDER BY Hour

这是一个简化的SQL Fiddle

祝你好运。

【讨论】:

  • 感谢您通过 JOIN 让我大开眼界,并将我指向这个不错的网站。我现在要多练习一些。该死,使用 LEFT JOIN 更容易阅读:D
  • @Gaston -- 没问题,很高兴我能帮上忙!
猜你喜欢
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 2022-11-15
  • 1970-01-01
相关资源
最近更新 更多