【发布时间】:2017-05-01 19:50:25
【问题描述】:
我有三张桌子 -
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 个表。
【问题讨论】: