2011-07-13 13 views
2

名前と固有のIDを持つ2つのテーブル、エンティティおよびコンポーネントがあります。これらの2つのIDの間の多対多の関係をマッピングする3番目のテーブルがあり、2つの列、entity_IDとcomponent_IDを含みます。エンティティはいくつかのコンポーネントで構成されています。構成表は次のようになりますので、もし:エンティティ2は2と6から作られている間、クエリの関連テーブルと別の列

+----------+---------------+ 
|entity_id | component_id | 
+----------+---------------+ 
|  1 |    1 | 
|  1 |    2 | 
|  2 |    2 | 
|  2 |    6 | 
+----------+---------------+ 

エンティティ1は、コンポーネント1,2から作られて、私も働いているアプリケーションは、利用可能なテーブルを持っています使用可能なすべてのコンポーネントのIDを含む。私の質問は、これは、どのように私はどのように使用可能なテーブルのコンポーネントの厳密に構築されたエンティティを返すためにデータベースをクエリするのですか?与えられた例では、1,2および6がすべて使用可能な表にある場合、エンティティー1および2を戻す必要があります。それ以外の場合、2が使用可能なテーブルにない場合(ただし、1と6は)、何も返されません。私はMySQLの初心者ですので、論理を説明することができれば偉大になるでしょう。

+0

参照整合性を強制する場合は、存在しないコンポーネントを持つエンティティを持つことすらできません。そうする場合は、ヌル値をチェックし、それらを破棄します。 –

+0

コンポーネントテーブルが頻繁に変更されます。コンポーネントがテーブルにない場合は、コンポーネントが一時的に使用不可であることを意味し、存在しないことを意味しません。 – caltangelo

+0

利用可能なコンポーネントはどのように知っていますか?それはコンポーネントテーブルIS_IN_STOCKのフラグか、そのリストをクエリに渡しますか? –

答えて

2

SELECT e.entity_id, e.name     --- Show all entities 
FROM entity AS e 
WHERE NOT EXISTS       --- for which there not exists 
     (SELECT *       --- any component that 
     FROM construction AS c    --- they need for the construction 
     WHERE c.entity_id = e.entity_id  
      AND c.component_id NOT IN   --- and it's not 
       (SELECT component_id 
        FROM available   --- available 
       ) 
    ) 

説明:

select distinct entity_id from construction 
where entity_id not in (
    select entity_id from construction c left outer join available a on a.id = c.component_id 
    where a.id is null 
); 
+0

ニースは、ここにソリューションを投稿していただきありがとうございます。 –

+0

待ちますか?あなたが質問で言及している多対多のマッピングテーブルはどこにありますか?なぜエンティティテーブルのcomponent_IDはまったくですか?あなたは3番目の正規形について完全に混乱しています。 –

+0

質問を編集してより明確にしました。 – caltangelo

1

私はこれを試していませんが、あなたはそれを打つことができます。私は基本的にあなたがそのコンポーネントとEに参加するとき少なくとも一つのヌル・コンポーネントを返すことをEすべてのエンティティを選択してる部分が存在するではないで

select * from construction c 
where not exists (
    select * from construction c2 left outer join available a on a.id = c2.component_id 
    where c2.entity_id = c.entity_id and a.id is null 
) 

は、内側のクエリはあなたを与える場合、あなたが期待するものを参照してください、トラブルシューティングをするにはUPDATE:私はアブドラのサブクエリ@テストし、実際に私が何を望むかの反対を持っ

select * from construction c2 left outer join available a on a.id = c2.component_id 
where a.id is null 
+0

これを試してみました。他のアイデア? – caltangelo

+0

'join'を' left outer join'と置き換えてみてください –

+0

ありがとうございます。私はあなたのクエリをうまく動作させることができませんでしたが、サブクエリは非常に助けになりました! – caltangelo

0

はこれを試してみてください:少しテストの後、私は私が探していたものを私に与えてネストされたクエリになってしまっていない任意の構成要素が存在するすべてのエンティティを示すこと彼らは必要とそれは利用できません。

関連する問題