2017-03-26 12 views
0

mysqlの結合を使用して時間差を得るのに問題があります。私は時差のために最小値と最大値で演奏しましたが、それを動作させることはできません。何か助けてくれてありがとう。MySQLでの結合との時間差を正確に取得する

SELECT DISTINCT 
    ab.record AS `record`, 
    ab.timeIn AS `timeIN`, 
    de.timeOut AS `timeOut`, 
    TIMEDIFF(de.timeOut,ab.timeIn) AS `timeDifference`, 
    ab.description AS `description`, 

    FROM 
    TableA ab 
    INNER JOIN TableB de ON de.record = ab.record 

    GROUP BY `timeIn`, `description` 

これはこれは、MySQLの時間差

結果希望するどのような
+----+--------+---------------------+---------------------+----------------+-------------+ 
| id | record | timeIn    | timeOut    | timeDifference | description | 
+----+--------+---------------------+---------------------+----------------+-------------+ 
| 1 | 9  | 2017-03-25 12:41:59 | 2017-03-25 12:47:17 | 00:05:18  | productA | 
+----+--------+---------------------+---------------------+----------------+-------------+ 
| 2 | 11  | 2017-03-25 12:42:00 | 2017-03-25 15:10:10 | 02:28:10  | productB | 
+----+--------+---------------------+---------------------+----------------+-------------+ 
| 4 | 14  | 2017-03-25 12:42:00 | 2017-03-25 12:47:18 | 00:05:18  | productC | 
+----+--------+---------------------+---------------------+----------------+-------------+ 
| 5 | 11  | 2017-03-25 15:00:35 | 2017-03-25 15:10:10 | 00:09:35  | productB | 
+----+--------+---------------------+---------------------+----------------+-------------+ 

とTableBの

+----+--------+---------------------+-------------+ 
| id | record | timeOut    | description | 
+----+--------+---------------------+-------------+ 
| 1 | 11  | 2017-03-25 15:10:10 | productB | 
+----+--------+---------------------+-------------+ 
| 2 | 9  | 2017-03-25 12:47:17 | productA | 
+----+--------+---------------------+-------------+ 
| 4 | 11  | 2017-03-25 12:47:17 | productB | 
+----+--------+---------------------+-------------+ 
| 5 | 14  | 2017-03-25 12:47:18 | productC | 
+----+--------+---------------------+-------------+ 

複合表であるTableAの

+----+--------+---------------------+-------------+ 
| id | record | timeIn    | description | 
+----+--------+---------------------+-------------+ 
| 1 | 9  | 2017-03-25 12:41:59 | productA | 
+----+--------+---------------------+-------------+ 
| 2 | 11  | 2017-03-25 15:00:35 | productB | 
+----+--------+---------------------+-------------+ 
| 4 | 11  | 2017-03-25 12:42:00 | productB | 
+----+--------+---------------------+-------------+ 
| 5 | 14  | 2017-03-25 12:42:00 | productC | 
+----+--------+---------------------+-------------+ 

です:

あなたはfirtsと最後の値を取得するためにあなたが分MXなどの集計関数を使用する必要があります
レコードごとにつ以上の値を持っている場合
+----+--------+---------------------+---------------------+----------------+-------------+ 
| id | record | timeIn    | timeOut    | timeDifference | description | 
+----+--------+---------------------+---------------------+----------------+-------------+ 
| 1 | 9  | 2017-03-25 12:41:59 | 2017-03-25 12:47:17 | 00:05:18  | productA | 
+----+--------+---------------------+---------------------+----------------+-------------+ 
| 2 | 11  | 2017-03-25 12:42:00 | 2017-03-25 12:47:17 | 00:05:18  | productB | 
+----+--------+---------------------+---------------------+----------------+-------------+ 
| 4 | 14  | 2017-03-25 12:42:00 | 2017-03-25 12:47:18 | 00:05:18  | productC | 
+----+--------+---------------------+---------------------+----------------+-------------+ 
| 5 | 11  | 2017-03-25 15:00:35 | 2017-03-25 15:10:10 | 00:09:35  | productB | 
+----+--------+---------------------+---------------------+----------------+-------------+ 
+0

したがって、レコードと説明が等しい場合は、クエリでtimeInとtimeOutを順番に使用することがわかりますか? TimeInがtimeOut – Edward

+0

より小さくなければならないことにwhere句を入れてください。集計関数を使わずにgroup byを使用するのはなぜですか。 ?? – scaisEdge

+0

@ Edwardそれはうまくいくかもしれない、私はそれを試してみる必要があります。 – newpie

答えて

0

そしてあなたべきグループ

SELECT 
    ab.record AS `record`, 
    min(ab.timeIn)AS `timeIN`, 
    max(de.timeOut) AS `timeOut`, 
    TIMEDIFF(max(de.timeOut),min(ab.timeIn)) AS `timeDifference`, 
    ab.description AS `description`, 

    FROM 
    TableA ab 
    INNER JOIN TableB de ON de.record = ab.record 

    GROUP BY record 
+0

これは私がこの作品を実行し、それが私に3つのエントリを与えるが見つかりましたが、残念ながら私が探しているものではありません。事はレコード11に関するもので、分、最大で他の情報なしでそれらを正しく結ぶ方法があるかどうかわからない。 – newpie

0

持つことの必要なしBUそこにある機能別のグループ。あなたはすべてのレコードが時間と時間を必要とするので、必要な結果を得るには最大の違いが必要です。

SELECT DISTINCT 
    ab.record AS `record`, 
    ab.timeIn AS `timeIN`, 
    de.timeOut AS `timeOut`, 
    TIMEDIFF(de.timeOut,ab.timeIn) AS `timeDifference`, 
    ab.description AS `description` 
FROM 
    TableA ab 
    INNER JOIN TableB de ON de.record = ab.record and de.timeOut between ab.timeIn and 
date_add(ab.timeIn,INTERVAL 2 HOUR); 

ここでは、最大で2時間の間を取っています。

もう1つのことができます。私たちはそのレコードと時間との間にrow_numberを取ることができます。時間とレコードによってデータが順序づけられるため、簡単に違いを得ることができます。

以下は同じコードです。

select distinct ti.record AS record, ti.timeIn AS timeIN,to.timeOut as timeOut, ti.description AS description, TIMEDIFF(to.timeOut,ti.timeIn) AS timeDifference, 
from (SELECT ab.record AS record, ab.timeIn AS timeIN,ab.description AS description, 
@row_num:=if(@record_rn=record,@row_num+1,1) rownum 
FROM TableA ab , 
(select @row_num:=1) x, 
(select @record_rn:='') y 
order by ab.record ace ab.timeOut desc) ti 
inner join 
(SELECT de.record AS record,de.timeOut AS timeOut,de.description, AS description, 
@row_num:=if(@record_rn=record,@row_num+1,1) rownum2 
FROM TableB de, 
(select @row_num:=1) x, 
(select @record_rn:='') y 
order by de.record ace de.timeOut desc) to on (ti.rownum=to.rownum and ti.record=to.record) 
+0

この方法では、このインスタンスの正しいデータを持つすべてのエントリを取得できますが、残念ながら、製品が2つではなく1つの数である場合があるため、間違っています。私はそれを持ち続けます。 – newpie

関連する問題