我有两个表,一个用户表和一个房屋表。用户只有一堆 ID(最小示例),例如:
CREATE TABLE users(
id character varying(24) NOT NULL,
PRIMARY KEY (id)
);
houses表有3列,分别是id、user_one和user_two,其中user_one和user_two对应的是用户id,比如:
CREATE TABLE houses(
id character varying(24) NOT NULL,
user_one character varying(24) NOT NULL,
user_two character varying(24) NOT NULL,
FOREIGN KEY (user_one) REFERENCES users(id),
FOREIGN KEY (user_two) REFERENCES users(id),
PRIMARY KEY (user_one, user_two)
)
假设我有一个 ID 为“123456”的用户,他按下了某个按钮。我想选择所有用户 ID,其中“123456”不是house 表的 user_one 列中的值。我认为这可能涉及左连接,但我在拥有一个我想要过滤的特定 ID(即“123456”)方面有点受挫,而不仅仅是一些一般的左连接。>
编辑:这是我的意思的一个例子: 用户表:
+------------------------+
| id |
+------------------------+
| 123456 | --call this row a--
| 532614 | --call this row b--
| 549481 | --call this row c--
| 832482 | --call this row d--
+------------------------+
房子表:
+------------------------+
| id| user_one| user_two |
+------------------------+
| 1 | 123456 | 532614 | -- important row --
| 2 | 549481 | 123456 |
| 3 | 532614 | 123456 |
| 4 | 549481 | 532614 |
+------------------------+
因此,在运行此查询后,我想从 users 表中返回行 c 和 d,因为在houses 表中有一行 user_one 是 123456,而 user_two 是 532614(重要的行),所以我想要从我的输出中排除 ID 为 532614 的用户。另外,我没有在输出中包含第 a 行,因为它等于 ID 123456 本身。
抱歉,如果这是一个基本问题,我正在从 noSQL 迁移过来,但在掌握这样更复杂的问题时仍然遇到一些困难。
谢谢。
答案 0 :(得分:1)
我会在这里使用存在逻辑:
SELECT u.id
FROM users u
WHERE NOT EXISTS (SELECT 1 FROM houses h
WHERE h.user_one = '123456' AND h.user_two = u.id) AND
u.id <> '123456';
如果要使用join版本,那么使用下面的left anti-join:
SELECT u.id
FROM users u
LEFT JOIN houses h
ON h.user_two = u.id AND h.user_one = '123456'
WHERE
u.id <> '123456' AND
h.id IS NULL;
这会尝试根据 user_two
列与用户匹配的条件将每个用户记录与房屋记录相匹配,房屋的 user_one
列是 '123456'
。然后它在 WHERE
子句中断言没有找到这样的匹配,表明用户是有效的(当然我们也检查用户是否不正确。
答案 1 :(得分:0)
也请分享示例数据并输出您需要的内容。
我可以在您的查询中看到一个问题。由于您使用的是左外连接,因此 user_one 不应出现在 where 子句中。你的查询应该是这样的
select users.id from users join houses on 1 = 1 and user_one != '123456';