问题描述
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_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