1
SELECT
    t3.id,
    t3.prod_ID,
    MIN(diff) AS min_time
FROM
    (SELECT
         t1.id,
         (UNIX_TIMESTAMP(t2.time_stamp_2) - UNIX_TIMESTAMP(t1.time_stamp)) AS diff
     FROM 
         production t1
     LEFT JOIN 
         process t2 ON t1.id = t2.id
     HAVING 
         diff >= 0) tx
LEFT JOIN 
    production t3 ON t3.id = tx.id
GROUP BY
    t3.id

実行後、返される結果は次のとおりです。

id  prod_ID   min_time
-----------------------
1   2         1200

代わりに返すべきものは

id  prod_ID   min_time
1   9         1200

複数の結合テストの後、最初は結合にエラーがあると思っていましたが、同じエラー結果になりました。

SQLフィドル

SQLFiddle_2

SQLFiddle_3

複数の ID を持っているため、Group By を使用していることを明確にするSQLFiddle_2

SQLFiddle_3をさらに展開します。

SQLFiddle_3 で実行した後、返される結果は次のとおりです。

id  prod_ID   min_time
-----------------------
1   2         1200
2   2         960
3   2         360

あるべき姿は

id  prod_ID   min_time
-----------------------
1   9         1200
2   2         960
3   3         360
4

2 に答える 2

0

あなたのクエリは実際には非常に間違っています.内部クエリは本質的に時差のリストを作成していますが、この良い仕事をすべて捨てて、prod_idに参加したりグループ化したりしないので、基本的に挿入した最初の値を選択するだけです.あなたのデータベースに。データを挿入する順序を入れ替えて prod_id を最初に挿入すると、目的の結果が得られますが、理由が間違っています。

あなたの内部クエリは、これを行うようなものです:

SELECT
    t1.id,
    t1.prod_id,
    (UNIX_TIMESTAMP(t2.time_stamp_2)-UNIX_TIMESTAMP(t1.time_stamp)) as diff
    FROM production t1
    left JOIN process t2
    ON t1.id = t2.id
   WHERE (UNIX_TIMESTAMP(t2.time_stamp_2)-UNIX_TIMESTAMP(t1.time_stamp)) > 0

それを実行すると、必要な値が表示されます。

id     prod_id    diff
1        2        1800
1        3        1380
1        9        1200

...しかし、外側のクエリはこれに対して何もしません。

これを行うには多くの方法がありますが、ここでは簡単な方法を 1 つ示します。

SELECT 
    t1.id,
    t1.prod_id,
    (UNIX_TIMESTAMP(t2.time_stamp_2)-UNIX_TIMESTAMP(t1.time_stamp)) as diff
    FROM production t1
    left JOIN process t2
    ON t1.id = t2.id
   WHERE (UNIX_TIMESTAMP(t2.time_stamp_2)-UNIX_TIMESTAMP(t1.time_stamp)) > 0
   ORDER BY 3
   LIMIT 1
于 2020-10-21T16:15:47.207 に答える