1

私はPHPでのプログラミングに比較的慣れていないので、これがかなり単純な質問である場合は申し訳ありません.

次の値を含む MachineReports という MySQL データベース テーブルがあります: ReportNum (主キー、自動インクリメント)、MachineID、およびタイムスタンプ

以下にデータの例を示します。

|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 のタイムスタンプの違いを見つけることです。私が検討したことの 1 つは、php で多次元配列を使用することです。$machineID をキーとして使用し、キーが指す配列内にタイムスタンプを格納します。

ただし、クエリが行ごとに解析されるため、その方法がわかりません。

いくつか質問があります。

1) これはこれを行うための最も効率的な方法ですか? データベース テーブルの設計が最適ではない可能性があります。2) 特定の machineID のタイムスタンプの違いを判断する最良の方法は何ですか?

これについて別の方法で考えるように促すトピックへのポインタだけでも役立ちます.私は研究をすることを恐れていません. ありがとう!

4

2 に答える 2

0

このソリューションでは、マシンごとに1行が必要であると想定しているため、これは大きな前提となる可能性があります。tsの最大値に対してnow()関数を使用できます。どのサンプル出力をリストすると、答えを微調整できると思いますか。

一時テーブルを作成し、machineidとmaxtsおよび以前のtsを使用できます。最後の2列はnullとして。個別のmachineidごとに行を挿入します。次に、各行のmaxtsをtsの最大値として更新します。maxtsの前の行maxtsである優先順位の各行を更新します。その後、あなたはあなたのデータを持っています

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 に答える