gpt4 book ai didi

mysql - sql 从表中选择没有出现在第二个表中的所有内容

转载 作者:行者123 更新时间:2023-11-29 03:22:48 25 4
gpt4 key购买 nike

我有三个表 -

Users [Id,Name]
Matches_A [Id1,Id2]
Matches_B[Id1,Id2]

我知道当前用户的 user_id。

对于每个 Id1,在任一匹配表中,都有许多条目。也就是说,两个表中的每个用户都有很多匹配项。

我需要选择不在任一匹配表中的所有用户。

我试过这个查询-

SELECT * FROM Users 
JOIN Matches_A ON Users.id = Matches_A.id2
JOIN Matches_B on Users.id = Matches_B.id2
WHERE Matches_A.id1 != $userid
AND Matches_B.id1 != $userid;

这行不通。

问题是 Matches 表中有条目具有相同的 id2 但不同的 id1。这意味着即使我排除了 id1 与 userid 匹配的行,该用户 (id2) 仍可能被返回,因为还有另一行具有相同的用户,其中 id1 与 user_id 不匹配。

如果这没有意义,让我重新措辞。选择我不想退回的所有内容会很容易。

SELECT * FROM Users 
JOIN Matches_A ON Users.id = Matches_A.id2
JOIN Matches_B on Users.id = Matches_B.id2
WHERE Matches_A.id1 != $userid
AND Matches_B.id1 = $userid;

将返回所有我不想要的行。我如何编写一个查询来获取所有其他行。

附言使用子查询很容易做到这一点,但我担心这会很慢,尤其是对于 3 个表。

最佳答案

认为不在不存在而不是加入:

SELECT *
FROM Users u
WHERE u.id NOT IN (SELECT a.id2 FROM Matches_A) AND
u.id NOT IN (SELECT b.id2 FROM Matches_B);

此版本假定 id2 在任何一个表中都不会是 NULL

关于mysql - sql 从表中选择没有出现在第二个表中的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41177219/

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