3

我需要以下帮助

我有表“数据”获取存储在其上的数据,如下所示

+------------+----------+-----------
| regdate    | regtime  | items              
+------------+----------+-----------
| 2013-03-02 | 09:12:03 | item1   
| 2013-03-02 | 10:12:05 | item1          
| 2013-03-02 | 15:12:07 | item2    
| 2013-03-02 | 20:12:09 | item3       
| 2013-03-02 | 21:12:11 | item4    
| 2013-03-02 | 22:12:14 | item3 

以此类推,10 个项目可以在一天中的不同时间从09:00 到 23:00上桌

我有另一个表“ItemsPerInterval”,如下所示

+------------+-------------+-------------+-------------+-------------+
| regdate    | reginterval | item1       | item2       | item3       |
+------------+-------------+-------------+-------------+-------------+
| 2013-03-01 | 09:00:00    | 0           | 0           | 0           |
+------------+-------------+-------------+-------------+-------------+

依此类推,间隔以30 分钟为基础增加,例如 09:00 , 09:30 , 10:00, 10:30 ... 直到 23:00


我想要做的是在表ItemsPerInterval上插入数据,以包括表“数据”item1、item2、item3、.... item10 ) 上的项目的重复计数并按间隔存储它们(09:00 :00, 09:30:00, 10:00:00, 10:30:00, .... 23:00:00 ) 以便每个间隔 - 例如 - 09:00:00将具有重复计数从09:00:00 到 09:29:59已在数据表中注册的所有项目,其余时间间隔为 23:00:00

编辑**1

因此最终必须在 ItemsPerInterval 表上注册所有以下间隔,并保存已在间隔时间窗口中报告的 10 个项目中的每个项目的计数

09:00:00
09:30:00
10:00:00
10:30:00
11:00:00
11:30:00
12:00:00
12:30:00
13:00:00
13:30:00
and so on .....
.
.
.
22:00:00
22:30:00
23:00:00

/编辑**1

我做了一些关于例程/程序的阅读,但我不知道区别,也不知道如何使用它来实现上述内容。

我正在使用软件:MySQL 软件版本:带有 PHP 的 5.5.24。

感谢您的支持

谢谢

4

1 回答 1

5

您可以使用此查询:

SELECT
  regdate,
  SEC_TO_TIME(TRUNCATE(TIME_TO_SEC(regtime)/(60*30),0)*(60*30)) reginterval,
  COUNT(CASE WHEN items='item1' THEN 1 END) item1,
  COUNT(CASE WHEN items='item2' THEN 1 END) item2,
  COUNT(CASE WHEN items='item3' THEN 1 END) item3,
  COUNT(CASE WHEN items='item4' THEN 1 END) item4
FROM Data
GROUP BY
  regdate,
  reginterval

如果您需要将结果行插入到新表中,只需在开头添加以下行:

INSERT INTO ItemsPerInterval (regdate, reginterval, item1, item2, item3, item4)
SELECT ...

编辑

如果您还想显示所有间隔,即使它们没有值,我认为您能做的最好的事情就是拥有一个Intervals包含您需要的所有间隔的表:

CREATE TABLE Intervals (
  reginterval time
);

INSERT INTO Intervals VALUES
('09:00:00'),
('09:30:00'),
('10:00:00'),
...

此查询返回所有间隔,并结合表中存在的所有日期:

SELECT Dates.regdate, Intervals.reginterval
FROM
  (SELECT DISTINCT regdate FROM Data) Dates,
  Intervals

此查询返回您需要的行:

SELECT
  di.regdate,
  di.reginterval,
  COUNT(CASE WHEN Data.items='item1' THEN 1 END) item1,
  COUNT(CASE WHEN Data.items='item2' THEN 1 END) item2,
  COUNT(CASE WHEN Data.items='item3' THEN 1 END) item3,
  COUNT(CASE WHEN Data.items='item4' THEN 1 END) item4
FROM (
  SELECT Dates.regdate, Intervals.reginterval
  FROM (SELECT DISTINCT regdate FROM Data) Dates,
       Intervals
  ) di
  LEFT JOIN Data
   ON di.regdate=Data.regdate
      AND di.reginterval=SEC_TO_TIME(TRUNCATE(TIME_TO_SEC(Data.regtime)/(60*30),0)*(60*30))
GROUP BY
  regdate,
  reginterval;

在此处查看小提琴。

这是如何运作的

这里的想法是使用TIME_TO_SECregtime函数将包含时间的字段转换为自一天开始以来的秒数:

TIME_TO_SEC(regtime)

然后我们将此数字除以 60*30,即 30 分钟内的秒数,只保留整数部分:

TRUNCATE(number_of_seconds/(60*30), 0)

然后我们将整数部分乘回到 60*30 得到秒数,四舍五入为 60*30 秒(30 分钟)。

使用SEC_TO_TIME我们将秒数转换回时间字段。

于 2013-03-12T22:16:13.157 回答