0

タスクテーブルにあるタスクステータスに従ってリストテーブルにあるリストステータスを更新したいのですが、すべてのタスクIDタスクステータスが1の場合、両方のテーブルに共通フィールドとしてリストIDがあり、すべてのタスクIDタスクステータスが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;

8-10+1 = -1 であるため、これは 0 に設定され、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 に置き換える必要がある場合があります。コメントで述べたように、タスク ID はリストでは意味がありません。

于 2012-09-21T05:02:41.600 に答える