2017-05-19 4 views
1

ある場合、私は3つのテーブルがあります。SQL - 更新idのすべてのブール値が真

タスク:(t_idは主キーで、all_doneはブール値です)

+------+-------------+ 
| t_id | all_done | 
+------+-------------+ 
| 1 |   0 | 
| 2 |   0 | 
+------+-------------+ 

サブタスク:(S_IDはAです主に行わキーは、ブール値である)

+------+------------+ 
| s_id |  done | 
+------+------------+ 
| 1 |   0 | 
| 2 |   0 | 
| 3 |   1 | 
| 4 |   1 | 
| 5 |   1 | 
| 6 |   0 | 
| 7 |   0 | 
+------+------------+ 

task_subtask:(S_IDとt_idは外部キーあるすべてのサブタスクがタスクに属していない)

。 10
+------+------+ 
| t_id | s_id | 
+------+------+ 
| 1 | 1 | 
| 1 | 2 | 
| 1 | 3 | 
| 2 | 4 | 
| 2 | 5 | 
+------+------+ 

task_subtaskは、どのサブタスクがどのタスクに属しているかを示します。
私の意図は、all_done = 1に、そのタスクのすべてのサブタスクが完了している場合にSQL呼び出しを行うことです。したがって、この例ではall_doneのために1に設定する必要がありt_id = 2

次のコードが動作しているようですが、私はUPDATEコールにこれを埋めるために管理することはできませんし、私がもし本当にわからないんだけど私はこの出力を取得したい、その文で

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); 

この呼び出しでエラーメッセージが

ERROR 1248(42000)である:すべての派生テーブルは、独自のエイリアス

を持っている必要がありますが、更新コールが希望ならば、私はよく分かりませんこのように働くことさえできます。

ありがとうございました!

答えて

1

あなたはクエリを複雑にしていました。私はこれがうまくいくと思います。

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 
+0

これは空のセットを返します – vienya

+0

@vienya ..どういう意味ですか?派生テーブルは何行返されますか? –

+0

ああ、申し訳ありません。私のせい。この例を実際のデータベースに合わせることはできませんでした。今それは働いている。どうもありがとうございました! – vienya

0

あなただけT_IDフィールドを追加し、同じテーブルとしてtask_subtaskマージした場合、

task_table:

+------+-------------+ 
| t_id | all_done | 
+------+-------------+ 
| 1 |   0 | 
| 2 |   0 | 
+------+-------------+ 

subtask_table:(S_ID、t_idは主キー)

+------+------+------------+ 
| s_id | t_id |  done | 
+------+-------------------+ 
| 1 | 1 |   0 | 
| 2 | 1 |   0 | 
| 3 | 1 |   1 | 
| 4 | 2 |   1 | 
| 5 | 2 |   1 | 
etc... 
+------+------|------------+ 

今すぐ試すことができます

= 0で行わどこより多くのサブタスクを持っていない場合は、各タスクのために、意味
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 

、[タスクがall_done設定更新= 1


もう一つの良い方法:で、更新サブタスクAFTERトリガーを作成します。上記の同じ論理。

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; 

私は今見て、ちょうど1台使用して、第三ソリューションを持っている:これは、単一の改行がまだ行われていないt_id

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) 
+0

あなたの努力に感謝しますが、私はこのケースではテーブルを調整することができないので、@ vkpの解決策が私にはより適しています。 – vienya

関連する問題