1

我对 PHP 编程比较陌生,所以如果这是一个相当简单的问题,我深表歉意。

我有一个名为 MachineReports 的 MySQL 数据库表,其中包含以下值:ReportNum(primary key, auto increment)、MachineID 和 Timestamp

以下是一些示例数据:

|ReportNum | MachineID |     Timestamp      |
|1         | AD3203     | 2012-11-18 06:32:28|
|2         | AD3203     | 2012-11-19 04:00:15|
|3         | BC4300     | 2012-11-19 04:00:15|

我试图做的是通过迭代每个行集来找到每个机器 ID 的时间戳差异(以秒为单位)。然而,我被困在最好的方法上。这是我到目前为止编写的代码:

<?php
include '../dbconnect/dbconnect.php';
      $machineID=[];

//Get a list of all MachineIDs in the database      
foreach($dbh->query('SELECT DISTINCT(MachineID) FROM MachineReports') as $row) {
        array_push($machineID, $row[0]);
   }

  for($i=0;$i<count($machineID);$i++){
    foreach($dbh->query("SELECT MachineID FROM MachineReports WHERE MachineID='$machineID[$i]' ORDER BY MachineID") as $row) {

    //code to associate each machineID with two time stamps goes here
 }
  }

?> 这段代码只是逐行列出表格的内容。我的最终目标是找到某个 MachineID 的时间戳差异。我考虑过的一件事是在 php 中使用多维数组 - 使用 $machineID 作为键,然后将时间戳存储在键指向的数组中。

但是,我不确定如何做到这一点,因为我的查询逐行解析。

我有很多问题。

1)这是最有效的方法吗?我怀疑我的数据库表设计可能不是最好的。2)确定某个机器ID的时间戳差异的最佳方法是什么?

即使只是指向一个可以促使我以不同方式思考这个问题的话题也会有所帮助——我不害怕做研究。谢谢!

4

2 回答 2

0

该解决方案假设您希望每台机器有 1 行,所以这可能是一个很大的假设!您可以针对 ts 的最大值使用 now() 函数。如果您列出您期望的示例输出,我们可以调整答案。

您可以使用 machineid 和 maxts 以及之前的 ts 创建一个临时表。最后两列为空。为每个不同的 machineid 插入一行。然后将每一行的 maxts 更新为其 ts 的最大值。更新每一行的priorts 是maxts 之前的最大ts 行。然后你有你的数据

CREATE TABLE t1 (
reportnum int not null AUTO_INCREMENT PRIMARY KEY,
machineid char(10) not null,
ts TIMESTAMP
);
 insert into t1 (machineid,ts) select 'AD3203','2012-11-18 06:32:28';
 insert into t1 (machineid,ts) select 'AD3203','2012-11-19 04:00:15';
 insert into t1 (machineid,ts) select 'BC4300','2012-11-19 04:00:15';

CREATE TABLE temp_rpt (
machineid char(10) not null,
maxts TIMESTAMP null,
priorts TIMESTAMP null
);

  insert into temp_rpt (machineid,maxts,priorts)
 select distinct machineid,null,null from t1;



UPDATE temp_rpt
SET maxts = 
  ( SELECT MAX(ts) 
    FROM t1
    WHERE machineid = temp_rpt.machineid
  )

UPDATE temp_rpt
SET priorts = 
  ( SELECT MAX(ts) 
    FROM t1
    WHERE machineid = temp_rpt.machineid
    and ts<temp_rpt.maxts
  )

 select * from temp_rpt;
+-----------+---------------------+---------------------+
| machineid | maxts               | priorts             |
+-----------+---------------------+---------------------+
| AD3203    | 2012-11-19 04:00:15 | 2012-11-18 06:32:28 |
| BC4300    | 2012-11-19 04:00:15 | NULL                |
+-----------+---------------------+---------------------+

然后做你的约会数学

于 2012-11-20T05:23:08.390 回答
0

不确定我完全理解您要做什么,但是如果您要计算 MachineID 相同的表的每一行之间的时间差,我相信类似以下的内容应该可以满足您的需要。

注意:这会找到每行之间的时间差(对于相同的 MachineID,它会随着每个新的 MachineID 重置为 00:00:00)。如果您想要第一行和最后一行之间的总数,则必须对 TimestampDiff 值求和。

DROP TABLE IF EXISTS tMachineReportsTest;
CREATE TABLE tMachineReportsTest (
    ReportNum INT UNSIGNED NOT NULL AUTO_INCREMENT,
    MachineID VARCHAR(6) NOT NULL,
    Timestamp DATETIME NOT NULL,
    PRIMARY KEY (ReportNum),
    UNIQUE KEY (MachineId, Timestamp)
);

INSERT INTO tMachineReportsTest VALUES
(NULL,'AD3203','2012-11-18 06:32:28'),
(NULL,'AD3203','2012-11-18 10:45:13'),
(NULL,'BC4300','2012-11-19 04:00:15'),
(NULL,'AD3203','2012-11-19 11:19:23'),
(NULL,'BC4300','2012-11-20 06:08:01'),
(NULL,'AD3203','2012-11-20 18:04:45')
;

SET @machineId     := NULL;
SET @lastMachineId := NULL;
SET @lastTimestamp := NULL;

SELECT x.ReportNum, x.MachineId, x.Timestamp, x.TimestampDiff FROM (
    SELECT
        tMRT.ReportNum,
        tMRT.MachineId,
        tMRT.Timestamp,
        @lastMachineId := @machineId AS _lastMachineId,
        @machineId     := tMRT.machineId AS _machineId,
        CASE WHEN @lastMachineId IS NULL OR @lastMachineId = @machineId THEN TIMEDIFF(tMRT.Timestamp, IFNULL(@lastTimestamp, tMRT.Timestamp)) ELSE '00:00:00' END TimestampDiff,
        @lastTimestamp := tMRT.Timestamp lastTimestamp
    FROM
        tMachineReportsTest tMRT
    ORDER BY
        tMRT.MachineId, tMRT.Timestamp
) x
;

结果查询的输出如下所示:

+-----------+-----------+---------------------+---------------+
| ReportNum | MachineId | Timestamp           | TimestampDiff |
+-----------+-----------+---------------------+---------------+
|         1 | AD3203    | 2012-11-18 06:32:28 | 00:00:00      |
|         2 | AD3203    | 2012-11-18 10:45:13 | 04:12:45      |
|         4 | AD3203    | 2012-11-19 11:19:23 | 24:34:10      |
|         6 | AD3203    | 2012-11-20 18:04:45 | 30:45:22      |
|         3 | BC4300    | 2012-11-19 04:00:15 | 00:00:00      |
|         5 | BC4300    | 2012-11-20 06:08:01 | 26:07:46      |
+-----------+-----------+---------------------+---------------+
6 rows in set (0.01 sec)
于 2012-11-20T06:29:30.257 回答