如果引用记录的其他记录链接到特定值,则从结果中排除记录

txu3uszq  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(302)

以下是我想要达到的目标:
有四个表,我必须参考,以获得我要找的数据。列表、部件、列表项和标签符号。
列表中有表示每个列表的记录
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

唇裂征

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标签,则应从结果中排除这些记录。
第二部分比较棘手,我遇到了麻烦。
每个 list 记录有多个 listitem 表示该列表上项目的记录。全部 list 有standardparts标签的记录应至少有一个 listitem 记录一个小零件标签,但不是所有做和不做的是我想找到的。 listitem 记录被称为属于一个特定的列表 listitem.listId 现场。所以,对于每个 list 我想检查一下 listitem s将smallparts作为标签(通过检查匹配的部分,以及上面显示的该部分的标签),如果没有这些 listitem 我想要父母吗 list 记录保存在结果集中。否则 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%'
        );

上述情况仍然存在 list 记录有 listitem 有适当小零件标签的记录。同样,我们的目标是过滤掉这些,因为我不需要修复它们。我在寻找所有 list 没有 listitem 用小零件的标签记录。
预期结果

id  name
--  ----
1   part1

只应返回list.id 1,因为它有一个standardparts标签,而它的listitems没有一个小部件标签。list.id 2确实有一个standardparts的标签,但它的一个listitems有一个smallparts的标签,因此应该将其排除在外。
这个问题涉及到我的问题,但主要是面向java的,答案并没有回答我的问题。
这个问题再次与我的问题擦肩而过,但实际上是一个不同的问题,即另一个表中不存在的值,而不是基于某个值存在的排除。
如果我遗漏了什么,我很乐意提供更多的信息。

7gcisfzg

7gcisfzg1#

你想要一个« 左连接 » 在具有« 小零件 », 使用where子句筛选出匹配的行。你可以用« 选择distinct » 以避免重复。最后,我怀疑你不需要加入上表« 零件 », 我把它拿走了。

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
hiz5n14c

hiz5n14c2#

我想试试 EXISTS 要查找的子句 list.id 有一个 StandardParts 标签,然后是 NOT EXISTS 子句将这些结果限制在没有部件具有 SmallParts 标签。

SELECT 
  l.id, 
  l.name
FROM 
  list AS l
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 la1 
      WHERE 
        la1.partId = p.id AND 
        la1.label LIKE '%SmallParts%'
    );

相关问题