计算字段后值返回错误

问题描述

void del_task(){
   int count=0;
   for(int i=0; i<w_checks.length; i++)
   {
     if(w_checks[i]==true)
       count++;
   }
   while(count>=0)
   {
     for(int j=0; j<w_checks.length; j++)
     {
       if(w_checks[j]==true)
       {
         setState(() {
           { w_tasks.removeAt(j);  //w_tasks is the list of all the tasks
           w_checks.removeAt(j);   //w_checks is the list that stores bool values corresponding to each checkBox
           }
         });
         for(int k=j; k<w_checks.length; k++)
           {
             w_tasks[k]=w_tasks[k+1];
             w_checks[k]=w_checks[k+1];

           }
         break;
       }
     }
     count--;
   }
 }

运行后,返回的结果是:

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

最初,我认为在进行多次联接测试后,联接出现错误,结果相同。

SQLFiddle

SQLFiddle_2

SQLFiddle_3

sqlfiddle_2 来说明我使用分组依据,因为我有多个ID

sqlfiddle_3 进行更多扩展。

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

id  prod_ID   min_time
1   9         1200

应该是

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

解决方法

在您的查询中,您仅GROUP BY t3.id,并且没有在t3.prod_ID上进行汇总,因此返回的值是不确定的。

我相信您不需要GROUP BY,甚至不需要重新加入production
试试这个:

SELECT t1.id,t1.prod_ID,(UNIX_TIMESTAMP(t2.time_stamp_2) - UNIX_TIMESTAMP(t1.time_stamp)) AS diff
FROM production t1 INNER JOIN process t2
ON t1.id = t2.id 
AND (t1.id,t1.prod_ID) = (
  SELECT p.id,p.prod_ID
  FROM production p
  WHERE p.id = t2.id AND (UNIX_TIMESTAMP(t2.time_stamp_2) - UNIX_TIMESTAMP(p.time_stamp)) >= 0
  ORDER BY (UNIX_TIMESTAMP(t2.time_stamp_2) - UNIX_TIMESTAMP(p.time_stamp)) LIMIT 1
)

请参见demo
结果:

> id | prod_ID | diff
> -: | ------: | ---:
>  1 |       9 | 1200
>  2 |       2 |  960
,

您的查询确实确实是错误的,您的内部查询实质上是在列出时差,但是随后您将所有这些好工作丢掉了,并且不加入或组合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

...但是您的外部查询对此没有任何作用。

执行此操作的方法有很多,这是一种简单的方法:

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
   WHERE (UNIX_TIMESTAMP(t2.time_stamp_2)-UNIX_TIMESTAMP(t1.time_stamp)) > 0
   ORDER BY 3
   LIMIT 1