php - 获取按模糊范围排序的每日数值统计数据

标签 php mysql performance

完成以下任务;我有一个表,其中有 3 列:ID、UserID 和 Time(日期时间类型)。现在我想得到以下统计数据:

我有 5 个范围:

  • 早上(上午 6 点 - 上午 11 点 30 分)
  • 中午(上午 11.30 至下午 2 点)
  • 下午(下午 2 点至下午 6 点)
  • 晚上(下午 6 点至晚上 10 点)
  • 夜间(晚上 10 点至早上 6 点)

例如,用户具有以下条目:

ID  UserID  Time
46  1       2011-11-17 17:51:24
47  1       2011-11-17 11:41:41
48  1       2011-11-17 07:31:20
49  1       2011-11-17 21:41:55
50  1       2011-11-17 21:58:28
99  1       2011-11-18 10:12:18

我的目标是获得以下数组:

Array (
 ['today']  => Array (
  ['morning'] => 1,
  ['noon'] => 1,
  ['afternoon'] => 1,
  ['evening'] => 2,
  ['night'] => 0
 )
 ['all']  => Array (
  ['morning'] => 2,
  ['noon'] => 1,
  ['afternoon'] => 1,
  ['evening'] => 2,
  ['night'] => 0
 )
 ['avg']  => Array (
  ['morning'] => 1.5,
  ['noon'] => 0.5,
  ['afternoon'] => 0.5,
  ['evening'] => 1,
  ['night'] => 0
 )
)

好吧,如果我真的要迭代用户所有值的结果集,它就会起作用,但我敢打赌,通过 MySQL 及其日期函数有一种更简单的方法。如果我尝试获取所有条目并且只想获取时间而不是日期时间,我也会遇到问题。我需要首先通过 php 日期函数解析它并获取时间本身,这实际上没有用,因为每个用户 ID 可能会得到几十万行这样的行。 日期本身必须存储在表中以供其他任务使用。

最佳答案

我建议将这些日期范围放入表格的时间字段中

timenames:
id   name      start     end
1    Morning   00:06:00  11:29:59
2    Noon      11:30:00  13:59:59
etc...

然后你就可以了

SELECT timenames.name, timenames.start, timenames.end, COUNT(users.id)
FROM timenames
LEFT JOIN users ON (TIME(users.`Time`) BETWEEN timenames.start AND timenames.end)
GROUP BY timenames.id

它应该为您提供每个时间名称的时间范围内所有事件的计数。

关于php - 获取按模糊范围排序的每日数值统计数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8171326/

相关文章:

php - 无法让字符串数字变成 float 或整数 PHP

php - 如何将段落拆分成句子

php - 如何避免 mySQL 在 mysql_result 上出现错误?

mysql - 轮函数中 case 表达式和除法运算符的使用错误

mysql - 哪个更快?插入还是更新?

php - 如何将表单输入中的用户 ID 值与数据库中的记录相匹配?

php - 如何比较同一个 MySQL 表中不同行的不同列(在 php 中)?

android - Fused Location Provider 更新速度不够快

mysql - 如果您尝试更新正在查询的表,MySQL 会做什么?

php - Laravel 获取关系返回错误数据