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);
+1 z powodu "tutaj jest SQLfiddle" –