mysql – 如果引用它们的其他记录链接到特定值,则从结果中排除记录
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 如果引用它们的其他记录链接到特定值,则从结果中排除记录,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3339字,纯文字阅读大概需要5分钟。
内容图文
![mysql – 如果引用它们的其他记录链接到特定值,则从结果中排除记录](/upload/InfoBanner/zyjiaocheng/902/be5db3ff8b6e4a61ad123f373f547743.jpg)
这是我想要完成的事情:
有四个表我必须参考以获取我正在寻找的数据. list,part,listitem和labelassign.
>列表包含表示每个列表的记录
> listitem表引用list.id并表示每个列表中的所有项目
>零件表包含所有零件,每个零件都有唯一的ID
> labelassign表具有友好标签(如标签),其中引用了partId以标记零件.
视觉:
名单
id name
-- ----
1 part1
2 part2
3 part3
4 part4
项目清单
id partId listId
-- ---- ------
1 10 1
2 11 1
3 12 1
4 13 2
5 14 2
部分
id name
-- ----
1 part1
2 part2
3 part3
4 part4
10 part10
11 part11
12 part12
13 part13
14 part14
Labelassign
id label partId
-- ----- ----
1 StandardParts 1
2 StandardParts 2
3 SmallParts 3
4 LargeParts 4
5 HugeParts 5
6 MediumParts 10
7 MediumParts 11
8 MediumParts 12
9 SmallParts 13
10 MediumParts 14
要获取具有特定标签的所有列表:
SELECT list.name
FROM list
INNER JOIN part ON list.name = part.name
INNER JOIN labelassign ON part.id = labelassign.partId AND labelassign.label LIKE '%StandardParts%'
# Using LIKE for '%StandardParts%' because there are variations in the real data but I want them all
如果list.name记录没有StandardParts标签,则应从结果中排除它们.
第二部分更棘手,我遇到麻烦.
每个列表记录都有许多listitem记录,表示该列表中的项目.所有具有StandardParts标签的列表记录都应该至少有一个带有SmallParts标签的listitem记录,但不是所有的都做,而不是我想要查找的那些.
listitem记录通过其listitem.listId字段被称为属于特定列表.因此,对于每个列表我要检查是否有其listItems中有SmallParts作为标签(通过检查匹配部分的方式,并如上图所示的那部分的标签),如果没有这些listItems中的做我想做的父列表记录保留在结果集中.否则,应从结果中排除list.name.
基于@Eric Brandt的初步答案,这是我到目前为止所做的:
SELECT DISTINCT
l.id,
l.num
FROM
list AS l
INNER JOIN
part AS p1
ON b.num = p1.num
# Without this up here I didn't get the filtration, lists without the StandardParts label were included in results
INNER JOIN
labelassign AS la
ON p1.id = la.partId
AND la.label LIKE '%StandardParts%'
INNER JOIN
listitem AS li
ON l.id = li.listId
INNER JOIN
part AS p
ON li.partId = p.id
WHERE
EXISTS
(
SELECT 1
FROM
labelassign AS la1
WHERE
la1.partId = p.id AND
la1.label LIKE '%StandardParts%'
)
AND NOT EXISTS
(
SELECT 1
FROM
labelassign AS la2
WHERE
la2.partId = p.id AND
la2.label LIKE '%SmallParts%'
);
上面仍然返回列表记录,其中包含具有正确标签SmallParts的listitem记录.同样,目标是过滤掉那些,因为我不需要修复它们.我正在寻找没有带有SmallParts标签的listitem记录的所有列表记录.
预期成绩
id name
-- ----
1 part1
只返回list.id 1,因为它的标签为StandardParts,并且其listitems都没有小部件的标签. list.id 2有一个StandardParts标签,但它的一个listitems有一个SmallParts标签,所以应该排除它.
This question触及我的问题,但主要是面向Java,答案不回答我的问题.
This question再次刷我的问题,但实际上是另一个问题,即另一个表中不存在的值,而不是基于值的存在而排除.
如果我遗漏了一些东西,我很乐意提供更多信息.
解决方法:
你想要一个«LEFT JOIN»对有«SmallParts»的项目,一个WHERE子句过滤掉匹配的行.您可以使用«SELECT DISTINCT»来避免重复.最后,我怀疑你不需要加入表«part»,我把它删除了.
SELECT DISTINCT
list.id,
list.name
FROM
list
INNER JOIN listitem ON list.id = listitem.listId
INNER JOIN labelassign l1 ON listitem.partId = l1.partId AND l1.labelId = AND l1.label LIKE '%StandardParts%'
LEFT JOIN labelassign l2 ON l2.partId = listitem.partId AND l2.label LIKE '%SmallParts%';
WHERE l2.partId IS NULL
内容总结
以上是互联网集市为您收集整理的mysql – 如果引用它们的其他记录链接到特定值,则从结果中排除记录全部内容,希望文章能够帮你解决mysql – 如果引用它们的其他记录链接到特定值,则从结果中排除记录所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。