Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL-如果id的所有布尔值都为真,则更新_Mysql_Sql - Fatal编程技术网

Mysql SQL-如果id的所有布尔值都为真,则更新

Mysql SQL-如果id的所有布尔值都为真,则更新,mysql,sql,Mysql,Sql,我有三张桌子: 任务:(t_id是主键,所有完成的都是布尔值) 子任务:(s_id是主键,done是布尔值) task_子任务:(s_id和t_id是外键。不是每个子任务都属于一个任务) 表task_子任务显示了哪个子任务属于哪个任务。 我的意图是,如果该任务的所有子任务都完成了,则进行一个sql调用,将all_done=1。所以在这个例子中,对于t_id=2,所有的_done都应该设置为1 以下代码似乎有效,但我无法将其填充到更新调用中,我也不确定我的思路是否正确: SELECT x.t_id

我有三张桌子:

任务:(t_id是主键,所有完成的都是布尔值)

子任务:(s_id是主键,done是布尔值)

task_子任务:(s_id和t_id是外键。不是每个子任务都属于一个任务)

表task_子任务显示了哪个子任务属于哪个任务。
我的意图是,如果该任务的所有子任务都完成了,则进行一个sql调用,将all_done=1。所以在这个例子中,对于t_id=2,所有的_done都应该设置为1

以下代码似乎有效,但我无法将其填充到更新调用中,我也不确定我的思路是否正确:

SELECT x.t_id, count(x.t_id), SUM(x.done) FROM (
    SELECT subtask.s_id, subtask.done, task_subtask.t_id FROM subtask JOIN task_subtask WHERE subtask.s_id = task_subtask.s_id
) AS x GROUP BY x.t_id;
通过该语句,我将得到以下输出:

+------+---------------+-------------+
| t_id | count(x.t_id) | SUM(x.done) |
+------+---------------+-------------+
|    1 |             3 |           1 |
|    2 |             2 |           2 |
+------+---------------+-------------+
我最好的尝试可能是:

UPDATE task, (SELECT x.t_id, count(x.t_id), SUM(x.done) FROM (
        SELECT subtask.s_id, subtask.done, task_subtask.t_id FROM subtask JOIN task_subtask WHERE subtask.s_id = task_subtask.s_id
    ) AS x GROUP BY x.t_id)
SET task.all_done = 1 WHERE task.t_id = t_id AND count(x.t_id) = SUM(x.done);
此调用的错误消息为

错误1248(42000):每个派生表都必须有自己的别名

但我不确定更新呼叫是否会以这种方式工作


提前感谢您的帮助

您使查询复杂化了。我认为这应该行得通

UPDATE task 
JOIN (SELECT ts.t_id 
      FROM subtask s
      JOIN task_subtask ts ON s.s_id = ts.s_id
      GROUP BY ts.t_id
      HAVING COUNT(s.s_id) = SUM(s.done) 
      ) x
ON task.t_id = x.t_id
SET all_done = 1  

如果您只是将task_子任务合并为同一个表,添加T_ID字段

任务表:

+------+-------------+
| t_id |    all_done |
+------+-------------+
|    1 |           0 |
|    2 |           0 |
+------+-------------+
子任务表:(s_id,t_id是主键)

现在你可以试试了

UPDATE TASK SET all_done=1 WHERE 
count
    (Select done from subtask join task 
    on subtask.t_id=task.t_id WHERE done=0)=0
这意味着,对于每个任务,如果在done=0的位置没有更多的子任务,则更新任务集all_done=1


另一个好方法是:使用上面相同的逻辑,在更新子任务之后创建触发器

CREATE TRIGGER set_all_done
AFTER UPDATE
   ON subtask FOR EACH ROW

BEGIN    
   IF count(Select done from subtask  WHERE subtask.t_id = new.t_id)=0
then UPDATE TASK SET all_done=1 WHERE Task.t_id = new.t_id

END;

我现在看看,有第三个解决方案,只使用一个表:

SELECT distinct t_id from subtask where done=0
这一行返回尚未完成的t_id,您可以将其用作验证,或者

UPDATE TASK SET all_done=1 WHERE t_id NOT in (SELECT distinct t_id from subtask where done=0)

这将返回一个空值set@vienya .. 什么意思?派生表返回多少行?啊,对不起。是我的错。我未能根据我的真实数据库调整示例。现在它开始工作了。非常感谢你!感谢您的努力,但由于我无法在这种情况下调整表,@vkp的解决方案更适合我。
UPDATE TASK SET all_done=1 WHERE 
count
    (Select done from subtask join task 
    on subtask.t_id=task.t_id WHERE done=0)=0
CREATE TRIGGER set_all_done
AFTER UPDATE
   ON subtask FOR EACH ROW

BEGIN    
   IF count(Select done from subtask  WHERE subtask.t_id = new.t_id)=0
then UPDATE TASK SET all_done=1 WHERE Task.t_id = new.t_id

END;
SELECT distinct t_id from subtask where done=0
UPDATE TASK SET all_done=1 WHERE t_id NOT in (SELECT distinct t_id from subtask where done=0)