完成以下任务;我有一个表,其中有 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/