Mysql SQL-如果id的所有布尔值都为真,则更新
我有三张桌子: 任务:(t_id是主键,所有完成的都是布尔值) 子任务:(s_id是主键,done是布尔值) task_子任务:(s_id和t_id是外键。不是每个子任务都属于一个任务) 表task_子任务显示了哪个子任务属于哪个任务。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
我的意图是,如果该任务的所有子任务都完成了,则进行一个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)