2013-07-11 13 views
5

Ecco uno SQLFiddle con schema e dati di esempio.Query MySQL per trovare record figlio in cui le voci della seconda tabella figlio non corrispondono

ho bisogno di essere in grado di trovare i record 'struttura' che sono collegati ai record 'item_version' dove un record 'item_version' non è collegato a tutti i partner (via 'item_version_partner' record) che è genitore record di 'struttura' è collegato a (tramite la sua tabella great grand child 'structure_version_range_partner').

Con i dati caricati nel violino, mi aspetto il seguente:

Versione Articolo 1 è legata sia alla Partner 1 e Partner 2 - e così è suo genitore - Struttura 1 , quindi dovrebbe essere non essere nel risultato.

voce Versione 2 è legata solo alle Partner 2, mentre il suo genitore (Struttura 2) è legato sia Partner 1ePartner 2 - quindi dovrebbe essere in il risultato.

I.e Struttura 2 Il record deve essere visualizzato come unico risultato.

Spero sia chiaro!

UPDATE 1: Ecco i dati di schema e prova ho usato:

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 a causa di "ecco un SQLfiddle" –

risposta

1

Sulla base della vostra aggiornamento questo dovrebbe essere un inizio.

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 

avere un gioco con essa il concetto è abbastanza semplice, è solo la normalizzazione che hai implementato lo rende un po 'ventoso. Selezionando i partner_id dalle due tabelle e rilasciando la clausola where mostrerà come funziona.

+0

Grazie per la risposta! Ho aggiunto la struttura effettiva e i dati di esempio che avevo nel violino - spero che sia più chiaro – johan

+0

Bit cheeky, ma okay. –

+0

Eccellente! Stavo lottando con tutti i tipi di clausole di avere e contare – johan

Problemi correlati