MySQL选择所有用户ID,其中'xyz'不是另一个表的列中的值

时间:2021-06-22 03:05:07

标签: mysql join left-join inner-join

我有两个表,一个用户表和一个房屋表。用户只有一堆 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 迁移过来,但在掌握这样更复杂的问题时仍然遇到一些困难。

谢谢。

2 个答案:

答案 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';

Demo

如果要使用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';
相关问题