MySQL查询查找第二个子表条目不匹配的子记录

时间:2013-07-11 20:57:29

标签: mysql

这是一个包含示例架构和数据的SQLFiddle

我需要能够找到链接到'item_version'记录的'结构'记录,其中'item_version'记录没有链接到所有合作伙伴(通过'item_version_partner'记录)它的父'结构'记录是链接到(通过其伟大的子表'structure_version_range_partner')。

随着小提琴中的数据加载,我期待以下内容:

项目版本1 合作伙伴1 合作伙伴2 相关联 - 其父级也是如此 - 结构1 ,所以应该在结果中。

项目版本2 仅链接到合作伙伴2 ,而其父级(结构2 )链接到合作伙伴1 合作伙伴2 - 因此 应该在结果中。

I.e 结构2 记录应作为唯一结果弹出。

我希望这很清楚!

更新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);

1 个答案:

答案 0 :(得分:1)

根据您的更新,这应该是一个开始。

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

玩它的概念非常简单,只是你实现的规范化使它有点刮风。从两个表中选择partner_id并删除where子句将演示它是如何工作的。