gpt4 book ai didi

mysql - 仅在 JOIN 不起作用时显示记录的子查询

转载 作者:行者123 更新时间:2023-12-01 00:49:45 24 4
gpt4 key购买 nike

我在 MySQL 中创建了一个相对简单的查询,根据名字和姓氏的匹配位置在三个表上给我一个 JOIN。从那里,我想编写另一个查询,然后只显示没有JOIN 匹配的记录——但我不太明白怎么做。我假设它与使用涉及类似 NOT IN 和我的原始查询的子查询有关,但我无法得到它给我想要的结果。

这是我试图想出的部分功能正常的解决方法:

SELECT *, 
if(t2.first=t1.first AND t2.last=t1.last, "Match", "No Match") AS "t2 Match",
if(t3.first=t1.first AND t3.last=t1.last, "Match", "No Match") AS "t3 Match"
FROM t1
LEFT JOIN t2 ON t2.first=t1.first AND t2.last=t1.last
LEFT JOIN t3 ON t3.first=t1.first AND t3.last=t1.last
WHERE if(t2.first=t1.first AND t2.last=t1.last, "Match", "No Match")="No Match"
OR if(t3.first=t1.first AND t3.last=t1.last, "Match", "No Match")="No Match";

我觉得这是相当简单直接的事情,但我没有得到正确的结果。有人可以帮忙吗?

谢谢!

最佳答案

不匹配意味着 t2(或 t3)列在结果中填充了 Null。所以你可以使用 IS NULL 检查:

SELECT t1.*
FROM t1
LEFT JOIN t2 ON t2.first = t1.first AND t2.last = t1.last
LEFT JOIN t3 ON t3.first = t1.first AND t3.last = t1.last
WHERE t2.first IS NULL
OR t3.first IS NULL ;

你是对的,你也可以使用 NOT IN 编写查询(警告:仅当连接列不可为空时。否则你可能会得到意想不到的结果):

SELECT t1.*
FROM t1
WHERE (first, last) NOT IN
( SELECT first, last FROM t2 )
OR (first, last) NOT IN
( SELECT first, last FROM t3 )
;

或使用NOT EXISTS:

SELECT t1.*
FROM t1
WHERE NOT EXISTS
( SELECT 1
FROM t2
WHERE t1.first = t2.first
AND t1.last = t2.last
)
OR NOT EXISTS
( SELECT 1
FROM t3
WHERE t1.first = t3.first
AND t1.last = t3.last
) ;

关于mysql - 仅在 JOIN 不起作用时显示记录的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17351196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com