0

我想根据任务表中的任务状态更新列表表中的列表状态,如果所有 taskid 任务状态为 1,则两个表都将 listid 作为公共字段,如果所有 taskid 任务状态不为 1,则将列表状态更改为 1然后将列表状态更改为 0 下面是触发器。我收到 sql 语法错误,请告诉我出了什么问题

  DROP TRIGGER IF EXISTS tada.list//

  CREATE TRIGGER tada.list
  AFTER INSERT ON tada.task
  FOR EACH ROW
 BEGIN
 UPDATE list t1 , task t2 SET t1.liststatus = t2.taskstatus FROM list t1 , task t2 WHERE t1.taskid = t2.taskid;
 END//
4

1 回答 1

0

我将获取该列表的所有任务的计数,并将其从任务状态的总和中减去(如果 1 和 0 是您拥有的唯一状态),然后将 1 添加到结果中,然后在您的更新中使用 GREATEST(result,0)陈述。

例如,您有 10 个任务,其中 8 个任务的状态为 1:

UPDATE list l set status = GREATEST((SELECT SUM(t.status)-count(*)+1 from task t
where t.listid = 100), 0) where l.listid = 100;

这会将其设置为 0,因为 8-10+1 = -1 并且 GREATEST 将选择 0。如果所有任务都已完成,则数学将是 10-10+1 = 1 并且 GREATEST 将使用 1。

如果值为 1,您可以在触发器中放置一个条件以仅更新列表,否则每次插入任务时都会触发更新。

您还应该重命名触发器,将其命名为 tada.list 没有意义。

CREATE TRIGGER update_list_status AFTER INSERT ON tada.task
FOR EACH ROW BEGIN
  UPDATE list l set status = GREATEST((SELECT SUM(t.status)-count(*)+1 from task t
  where t.listid = new.listid), 0) where l.listid = new.listid;
END

您可能需要将 listid 替换为您正在使用的任务和列表都具有的任何唯一 ID。就像我在评论中所说,taskid 在列表中没有意义。

于 2012-09-21T05:02:41.600 回答