Sql 计算字段后返回的值不正确

Sql 计算字段后返回的值不正确,sql,calculated-columns,calculated-field,sql-calc-found-rows,Sql,Calculated Columns,Calculated Field,Sql Calc Found Rows,运行后,返回的结果是: 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 pro

运行后,返回的结果是:

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   9         1200
它应该返回的是

id  prod_ID   min_time
-----------------------
1   2         1200
我最初认为在连接中有一个错误,经过多次连接测试,相同的错误结果

SQLFiddle_2澄清我使用Group By是因为我有多个ID

SQLFiddle_3以进行更多扩展

在SQLFiddle_3上运行后,返回的结果是:

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   9         1200
它应该是什么

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

您的查询确实是非常错误的,您的内部查询本质上是在列出时间差,但随后您放弃了所有这些好的工作,并且不在prod_id上加入或分组,所以它本质上只是拾取您插入到数据库中的第一个值。如果切换插入数据的顺序,以便先插入产品id,则会得到所需的结果,但原因错误

您的内部查询是这样做的:

id  prod_ID   min_time
-----------------------
1   9         1200
2   2         960
3   3         360
如果运行该选项,您将看到所需的值:

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

在查询中,您只按t3.id对
进行分组,而不在
t3.prod\u 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
   ORDER BY 3
   LIMIT 1
请参阅。
结果:


嗨,汉塞尔先生。我编辑了我的问题,我不能使用限制,因为(在这种情况下)有多个IDGood insight Hansell先生,但我还需要计算字段中>0“filter”后的MIN。抱歉@forpas,为了澄清,我编辑了我的问题。我不能使用限制,因为/万一有多个ID@silver_river你的MySql版本是什么?对不起,我是一个初学者,MySql 5.6我还需要从计算字段中“过滤”出负值后找到最小值。对不起,一个问题。我不知道我可以在这个
和(t1.id,t1.prod\u id)
中使用两列,我想只能使用这样一列
和(t1.id)
。你能分享一些我可以进一步阅读的材料吗。老实说,我不知道用谷歌搜索什么。还有一个,我只想我可以使用,
和(t1.id,t1.prod_id)
,在过滤上使用'And'after'WHERE'子句。有什么我可以进一步阅读的材料吗?抱歉耽误了你的时间。