2013-07-11 7 views
5

Oto SQLFiddle z przykładowym schematem i danymi.Zapytanie MySQL umożliwiające znalezienie rekordu podrzędnego, w którym wpisy w drugiej podrzędnej tabeli nie są zgodne.

Potrzebuję być w stanie znaleźć rekordy "struktury", które są powiązane z rekordami "item_version", gdzie rekord "item_version" nie jest powiązany z WSZYSTKIMI partnerami (za pośrednictwem rekordów "item_version_partner"), że jest to rekord "struktury" nadrzędnej jest połączony z (przez swoją wielką tablicę podrzędną "structure_version_range_partner").

Z danych załadowanych na skrzypcach, spodziewam się, co następuje:

Pozycja Wersja 1 jest powiązana zarówno Partner 1 i Partner 2 - i tak jest jego rodzic - Struktura 1 , więc powinno być , a nie w wyniku.

Pozycja Wersja 2 jest związana tylko Partner 2, podczas gdy jego rodzica (Struktura 2) wiąże się zarówno Partner 1iPartner 2 - więc powinny być w wynik.

I.e Struktura 2 rekord powinien wyskoczyć jako jedyny wynik.

Mam nadzieję, że to jasne!

UPDATE 1: Oto schemat oraz dane testu użyłem:

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 z powodu "tutaj jest SQLfiddle" –

Odpowiedz

1

podstawie aktualizacją powinno to być początek.

Select s.Description From Structure s 
inner join structure_version sv On sv.structure_id = s.id 
inner join Structure_version_range svr on svr.structure_version_id = sv.id 
inner join structure_version_range_partner svrp On svrp.structure_version_range_id = svr.structure_version_id 
inner join item_version iv on iv.structure_id = s.id 
Left join item_version_partner ivp On ivp.item_version_id = iv.ID and ivp.partner_id = svrp.partner_id 
Where ivp.partner_id is null 

Mają grać z nim koncepcja jest dość prosta, to tylko normalizacja, które zostały wdrożone czyni go nieco wietrznie. Wybierając parametry partner_ids z dwóch tabel i zrzucając klauzulę where, pokażemy, jak to działa.

+0

Dzięki za odpowiedź! Dodałem rzeczywistą strukturę i przykładowe dane, które miałem w skrzypcach - mam nadzieję, że będzie to wyraźniejsze. – johan

+0

Trochę bezczelnie, ale w porządku. –

+0

Doskonały! Walczyłem ze wszystkimi rodzajami klauzul o wartości i policzenia – johan

Powiązane problemy