2013-07-11 9 views
5

サンプルスキーマとデータを持つSQLFiddleです。2番目の子テーブルのエントリが一致しない子レコードを検索するMySQLクエリ

'item_version'レコードにリンクされている '構造'レコードを見つけることができる必要があります。 'item_version'レコードがすべてのパートナ( 'item_version_partner'レコードを介して)にリンクされていない場合、 (偉大な壮大な子テーブル 'structure_version_range_partner'を介して)リンクされています。フィドルにロードされたデータと

、私は次の期待:

アイテムのバージョン1パートナーの両方にリンクされている1パートナー2 - ので、その親である - 構造1ので、結果はではなく、になるはずです。

バージョン2だけその親ながら、 パートナー2にリンクされている 項目(構造2)が1 パートナー2 パートナーの両方にリンクされている

- それはにする必要があります結果。

e 構造2レコードが唯一の結果として飛び出すはずです。

私はそれがはっきりしていることを望みます!

UPDATE 1:ここで私が使用するスキーマとテストデータがあります:

CREATE TABLE partner (
    id bigint(20) NOT NULL AUTO_INCREMENT, 
    partner_name varchar(255) NOT NULL, 
    PRIMARY KEY (id) 
); 

CREATE TABLE structure (
    id bigint(20) NOT NULL AUTO_INCREMENT, 
    description varchar(50) NOT NULL, 
    PRIMARY KEY (id) 
); 

CREATE TABLE structure_version (
    id bigint(20) NOT NULL AUTO_INCREMENT, 
    structure_id bigint(20) NOT NULL, 
    PRIMARY KEY (id), 
    KEY fk_st_structure (structure_id), 
    CONSTRAINT fk_st_structure FOREIGN KEY (structure_id) REFERENCES structure (id) 
); 

CREATE TABLE structure_version_range (
    id bigint(20) NOT NULL AUTO_INCREMENT, 
    structure_version_id bigint(20) NOT NULL, 
    PRIMARY KEY (id), 
    KEY fk_svr_structure_version (structure_version_id), 
    CONSTRAINT fk_svr_structure_version FOREIGN KEY (structure_version_id) REFERENCES structure_version (id) 
); 

CREATE TABLE structure_version_range_partner (
    id bigint(20) NOT NULL AUTO_INCREMENT, 
    partner_id bigint(20) NOT NULL, 
    structure_version_range_id bigint(20) NOT NULL, 
    PRIMARY KEY (id), 
    KEY fk_svrp_version_range (structure_version_range_id), 
    KEY fk_svrp_partner (partner_id), 
    CONSTRAINT fk_svrp_partner FOREIGN KEY (partner_id) REFERENCES partner (id), 
    CONSTRAINT fk_svrp_version_range FOREIGN KEY (structure_version_range_id) REFERENCES structure_version_range (id) 
); 

CREATE TABLE item_version (
    id bigint(20) NOT NULL AUTO_INCREMENT, 
    structure_id bigint(20) NOT NULL, 
    item_version_name varchar(255) NOT NULL, 
    PRIMARY KEY (id), 
    KEY fk_iv_structure (structure_id), 
    CONSTRAINT fk_iv_structure FOREIGN KEY (structure_id) REFERENCES structure (id) 
); 

CREATE TABLE item_version_partner (
    id bigint(20) NOT NULL AUTO_INCREMENT, 
    item_version_id bigint(20) NOT NULL, 
    partner_id bigint(20) NOT NULL, 
    PRIMARY KEY (id), 
    KEY fk_ivp_item_version (item_version_id), 
    KEY fk_ivp_partner (partner_id), 
    CONSTRAINT fk_ivp_item_version FOREIGN KEY (item_version_id) REFERENCES item_version (id), 
    CONSTRAINT fk_ivp_partner FOREIGN KEY (partner_id) REFERENCES partner (id) 
); 

insert into partner values (1, 'Partner 1'); 
insert into partner values (2, 'Partner 2'); 

insert into structure values(1, 'Structure 1'); 
insert into structure values(2, 'Structure 2'); 

insert into structure_version values(1,1); 
insert into structure_version values(2,2); 

insert into structure_version_range values(1,1); 
insert into structure_version_range values(2,2); 

insert into structure_version_range_partner values(1,1,1); 
insert into structure_version_range_partner values(2,2,1); 
insert into structure_version_range_partner values(3,1,2); 
insert into structure_version_range_partner values(4,2,2); 

insert into item_version values(1,1,'Item Version 1'); 
insert into item_version values(2,2,'Item Version 2'); 

insert into item_version_partner values(1,1,1); 
insert into item_version_partner values(2,1,2); 
insert into item_version_partner values(3,2,1); 
+0

+1のため「こちらはSQLfiddleです」 –

答えて

1

あなたの更新に基づき、これは開始する必要があります。

コンセプトはかなりシンプルですが、実装しているのはちょっと風が強いだけです。 2つのテーブルからpartner_idsを選択し、where句を削除すると、その動作方法をデモンストレーションします。

+0

お返事ありがとうございます!私は実際の構造と私がフィドルに持っていたサンプルデータを追加しました。それがより明確になることを願って。 – johan

+0

ビットは素敵ですが、大丈夫です。 –

+0

優秀!私はすべての種類の持っているとカウント句で苦労していた – johan

関連する問題