jjzjj

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

coder 2023-10-06 原文

这是一个 SQLFiddle带有示例架构和数据。

我需要能够找到链接到“item_version”记录的“结构”记录,其中“item_version”记录未链接到所有合作伙伴(通过“item_version_partner”记录),它是父“结构”记录链接到(通过其曾孙表“structure_version_range_partner”)。

在 fiddle 中加载数据后,我希望得到以下结果:

Item Version 1 链接到 Partner 1Partner 2 - 它的父级 - Structure 1,所以它应该在结果中。

Item Version 2 仅链接到Partner 2,而其父项(Structure 2)同时链接到Partner 1 合作伙伴 2 - 所以它应该在结果中。

Structure 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);

最佳答案

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

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_ids 并删除 where 子句将演示它是如何工作的。

关于MySQL 查询查找第二个子表条目不匹配的子记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17603365/

有关MySQL 查询查找第二个子表条目不匹配的子记录的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  3. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  4. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  5. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  6. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  7. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  8. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  9. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  10. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

随机推荐