Mysql 如何在第一个查询中选择行,但在第二个查询中不选择行?

Mysql 如何在第一个查询中选择行,但在第二个查询中不选择行?,mysql,database,Mysql,Database,我有下面的MYSQL查询,我试图选择在query1中存在但在query2中不存在的行,我尝试使用not EXISTS,但这个概念不适用于我的用例,我提供了示例数据和结果,我的用例有替代方法吗?我在寻找什么 SELECT si.software_image_id, si.software_image, sib.software_image_build, si.software_image_tag_id FROM software_product_builds spb

我有下面的MYSQL查询,我试图选择在query1中存在但在query2中不存在的行,我尝试使用not EXISTS,但这个概念不适用于我的用例,我提供了示例数据和结果,我的用例有替代方法吗?我在寻找什么

SELECT
    si.software_image_id,
    si.software_image,
    sib.software_image_build,
    si.software_image_tag_id
FROM software_product_builds spb
INNER JOIN software_product_build_software_image_builds spbsib ON spb.software_product_build_id = spbsib.software_product_build_id
INNER JOIN software_image_builds sib ON spbsib.software_image_build_id = sib.software_image_build_id
INNER JOIN software_images si ON sib.software_image_id = si.software_image_id 
WHERE spb.software_product_build = 'CI_xxxx.LA.0.1-03291-STD.INT-7' and  NOT EXISTS

(SELECT
    si.software_image_id,
    si.software_image,
    sib.software_image_build,
    si.software_image_tag_id
FROM software_product_builds spb
INNER JOIN software_product_build_software_image_builds spbsib ON spb.software_product_build_id = spbsib.software_product_build_id
INNER JOIN software_image_builds sib ON spbsib.software_image_build_id = sib.software_image_build_id
INNER JOIN software_images si ON sib.software_image_id = si.software_image_id
WHERE spb.software_product_build = 'CI_xxxx.LA.0.1-03291-STD.INT-6')
查询1结果

查询2结果

预期产出:-

1781    BTFM.HW_NPR.1.1 BTFM.HW_NPR.1.1-00007-QCACHROM-1    2
左连接方法-慢

我以前从未使用过not exists方法,但如果您将第二个查询加入到第一个查询中,并获得仅在第一个查询中出现的结果,则可能会起作用。我是这样想的:

SELECT 
    query_1.*
FROM
    (SELECT 
        si.software_image_id,
            si.software_image,
            sib.software_image_build,
            si.software_image_tag_id
    FROM
        software_product_builds spb
    INNER JOIN software_product_build_software_image_builds spbsib ON spb.software_product_build_id = spbsib.software_product_build_id
    INNER JOIN software_image_builds sib ON spbsib.software_image_build_id = sib.software_image_build_id
    INNER JOIN software_images si ON sib.software_image_id = si.software_image_id
    WHERE
        spb.software_product_build = 'CI_xxxx.LA.0.1-03291-STD.INT-7') AS query_1
        LEFT JOIN
    (SELECT 
        si.software_image_id,
            si.software_image,
            sib.software_image_build,
            si.software_image_tag_id
    FROM
        software_product_builds spb
    INNER JOIN software_product_build_software_image_builds spbsib ON spb.software_product_build_id = spbsib.software_product_build_id
    INNER JOIN software_image_builds sib ON spbsib.software_image_build_id = sib.software_image_build_id
    INNER JOIN software_images si ON sib.software_image_id = si.software_image_id
    WHERE
        spb.software_product_build = 'CI_xxxx.LA.0.1-03291-STD.INT-6') AS query_2 ON query_1.software_image_build = query_2.software_image_build
WHERE
    query_2.software_image_build IS NULL
假设软件产品构建是您要测试的唯一字段

不在方法中-缓慢

如果左连接对性能不利,您可以执行一个简单的where字段不在第二个查询中,如:

SELECT 
    si.software_image_id,
    si.software_image,
    sib.software_image_build,
    si.software_image_tag_id
FROM
    software_product_builds spb
        INNER JOIN
    software_product_build_software_image_builds spbsib ON spb.software_product_build_id = spbsib.software_product_build_id
        INNER JOIN
    software_image_builds sib ON spbsib.software_image_build_id = sib.software_image_build_id
        INNER JOIN
    software_images si ON sib.software_image_id = si.software_image_id
WHERE
    spb.software_product_build = 'CI_xxxx.LA.0.1-03291-STD.INT-7'
        AND sib.software_image_build NOT IN (SELECT 
            sib.software_image_build
        FROM
            software_product_builds spb
                INNER JOIN
            software_product_build_software_image_builds spbsib ON spb.software_product_build_id = spbsib.software_product_build_id
                INNER JOIN
            software_image_builds sib ON spbsib.software_image_build_id = sib.software_image_build_id
                INNER JOIN
            software_images si ON sib.software_image_id = si.software_image_id
        WHERE
            spb.software_product_build = 'CI_xxxx.LA.0.1-03291-STD.INT-6')
无论哪种方式,您仍然需要确定您的唯一标识符是什么,以便检查它在第二个查询中是否不存在,如@shadow所指出的。SQL如何知道要检查的匹配项不存在?SQL需要确切地知道它匹配的是什么。即使您需要通过如下方式连接字段来检查字段的组合:

WHERE CONCAT(si.software_image, sib.software_image_build,) NOT IN (SELECT CONCAT(si.software_image,sib.software_image_build) FROM .......,
最终更新,不存在方法-最佳性能

在shadows评论的后面,我发现“不存在”方法的性能要好得多。因此,请尝试:

SELECT 
    si.software_image_id,
    si.software_image,
    sib.software_image_build,
    si.software_image_tag_id
FROM
    software_product_builds spb
        INNER JOIN
    software_product_build_software_image_builds spbsib ON spb.software_product_build_id = spbsib.software_product_build_id
        INNER JOIN
    software_image_builds sib ON spbsib.software_image_build_id = sib.software_image_build_id
        INNER JOIN
    software_images si ON sib.software_image_id = si.software_image_id
WHERE
    spb.software_product_build = 'CI_xxxx.LA.0.1-03291-STD.INT-7'
        AND NOT EXISTS( SELECT 
            *
        FROM
            software_product_builds spb_two
                INNER JOIN
            software_product_build_software_image_builds spbsib_two ON spb_two.software_product_build_id = spbsib_two.software_product_build_id
                INNER JOIN
            software_image_builds sib_two ON spbsib_two.software_image_build_id = sib_two.software_image_build_id
                INNER JOIN
            software_images si_two ON sib_two.software_image_id = si_two.software_image_id
        WHERE
            spb_two.software_product_build = 'CI_xxxx.LA.0.1-03291-STD.INT-6'
                AND sib_two.software_image_id = sib.software_image_id)

我可能看得太快了,但预期的输出确实出现在两个查询中,对吗?因此,要获得预期的输出,您需要说它确实存在于两个查询中?@JasonJoslin-否,它只出现在查询1中,请注意最后几位数字BTFM.HW_NPR.1.1-00007,它是查询2中的BTFM.HW_NPR.1.1-00006不存在的子查询不是相关的子查询,因此,当mysql在外部查询的结果中循环时,其结果不会改变。您需要使用子查询的where子句将外部查询与子查询连接起来。再次重申,你没有详细描述问题,很难提出解决方案。您可能必须检查所有4个字段。@Shadow-我也给出了预期的输出。……如果您没有信息,可以不参与此线程,而不是让其他人失望。您为什么这么说?从我的观点来看,我详细解释了所有内容,如果您不理解并且觉得缺少了某些内容,你为什么不详细询问和解释,而不是指责?你不是指控的始作俑者,所以你把他们留给自己,而选择忽略提供的细节…同样很难理解的是,我所需要的只是两个查询之间的增量行..很简单如何关联这两个查询也是我不理解的事情。顺便说一句,对于此类问题,“不存在”子查询的性能通常比“左连接”更好,因为“不存在”不必从右侧的表达式中提取任何数据,而“连接”则可以。它们不相关,它们是两个独立的查询..问题是如何只打印查询2中不存在的查询1中的行,如果不存在不起作用,还有其他选择吗?@user3508811如果这两个查询与每个Other都不相关,那么您的问题就毫无意义了。当您考虑外部查询中存在子查询中的记录时,必须定义。这就是你们的关系。@JasonJoslin我并没有说ledt join的性能不好,只是“不存在”通常对这类问题有更好的性能。Not in还需要获取底层记录来进行匹配,因此它的性能通常也不好,因为在这种特定类型的查询中不存在。是的,我认为notin实际上比使用左连接更糟糕,因为我很确定它需要为在左侧找到的每个结果运行子查询条件。我可能会删除我的答案供参考