2016-05-16 13 views
2

私は以下の表を持っている:このクエリをMySQLに書き込む方法は?

project(pid integer primary key, title varchar(30), finished boolean) 
action(aid integer primary key, title varchar(30), finished boolean) 
project_action(pid integer, aid integer, primary key(pid, aid)) 

プロジェクトは、複数のアクションで構成することができ、アクションはどれか一つのプロジェクトに所属することができます。したがって、枢機卿は(プロジェクト)0..1 < - > *(アクション)です。

どのようにすれば、すべてのアクションが完了したプロジェクトだけを取得できますか?

は、私はこれを試してみましたが、それはすでに私にその行動の一つだけが終了した場合にプロジェクトを与える:

SELECT pid FROM project WHERE pid IN (SELECT DISTINCT pid FROM project_action WHERE aid IN (SELECT aid FROM action WHERE action.finished = true)); 

答えて

1

あなたのテーブルの内容の意図について、やや不明瞭けれども、私はあなたの構造が少しオフかもしれないと思います。私は車の修理の簡単な例を作りましょう(と私は決して車体の人ではありません)。

Project, Repair Person "A" car. 
Pre-clean 
Pull dent/repair parts 
Apply any filler 
Sand it 
Paint 

「アクション」は、複数のプロジェクト間で一貫性のあることを行っている場合、そのテーブルには、「終了」ブールフラグを持っていません。このフラグは、作業中のプロジェクトに固有のフラグです。もし私が10台の車を持っていれば、3つを完全に仕上げ、7つの作業を7つの段階に分けることができます。だから、言った、私はすべてのことを言って、より

project(pid integer primary key, title varchar(30), finished boolean) 
action(aid integer title varchar(30)) 
project_action(pid integer, aid integer, finished boolean, primary key(pid, aid)) 

のような構造を期待しているだろうし、あなたのオリジナルの構造に滞在し、あなたがする必要がある例につき、2、3以上のアクションを使用してプロジェクトを持つことができますその上で実行されます。 ANYアクションが不完全な場合、プロジェクト全体が不完全です。私も(、PID、援助終了)に基づいて

をあなたの「アクション」テーブルの上にインデックスを持つことになり、これは基本的に私を与える...述べて

SELECT 
     p.pid, 
     p.title 
    from 
     project p 
    where 
     NOT EXISTS (select pa.pid 
        from project_action pa 
         join action a on pa.aid = a.aid 
         AND a.finished = false 
        where pa.pid = p.pid) 

偽=完成ではないがEXISTSありません現在のプロジェクトが何であっても、プロジェクトのために保留中のアクションが「偽」されていないすべてのプロジェクト。 EXISTS(またはNOT EXISTS)は、条件を満たすレコードが見つかるとすぐに停止します。したがって、もしあなたがプロジェクトのために不完全なものが10つあるならば、ONEが見つかるとすぐに、それは適格なWHEREと一緒に行われ、プロジェクトレコードを受け入れるか拒否して次のプロジェクトに進みます。

+0

ありがとう!私は2年ほどそれを必要としなかったので、その方法では 'NOT EXISTS'を使うことを忘れてしまった。 – LPrc

0

私はテーブルを結合します:

SELECT project.pid FROM project, project_action, action 
WHERE project.pid = project_action.pid 
AND project_action.aid = action.aid 
AND action.finished = TRUE 
+0

okを最初に試してみましたが、適切なJOIN構文と古いカンマ区切りを学ぶことのほうが優れています。第2に、プロジェクトに10のアクションがあり、6つしか完了しなかった場合、プロジェクト全体が完了していません。 – DRapp

0

だけでプロジェクトを選択してください未完成の行動はありません。このアプローチは、あなたにも全く行動のないプロジェクトを与えることに注意してください。

SELECT pid FROM project WHERE pid NOT IN 
    (SELECT DISTINCT pid FROM project_action WHERE aid IN 
    (SELECT aid FROM action WHERE action.finished = false) 
); 
0

これを試してみてください -

SELECT project.pid FROM project LEFT JOIN project_action ON project_action.pid = project.pid LEFT JOIN action ON project_action.aid = action.aid WHERE action.finished = true

0
SELECT p.pid FROM project p WHERE p.pid NOT IN 
    (SELECT pa.pid FROM project_action pa 
    JOIN action a ON pa.aid = a.aid 
    WHERE a.finished = FALSE) 
関連する問題