MySQL select 所有用户 ID,其中 'xyz' 不是另一个 table 的列中的值

MySQL select all user ids where 'xyz' is not a value in a column of another table

我有两个table,一个用户table和一个房子table。用户只有一堆 ID(最小示例),例如:

CREATE TABLE users(
    id character varying(24) NOT NULL,
    PRIMARY KEY (id)
);

房子table有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”的用户,他按下了某个按钮。我想 select 所有用户 ID,其中 '123456' 是 而不是 房屋 table 的 user_one 列中的值。我认为这可能涉及左连接,但我在拥有一个我想过滤的特定 ID(即“123456”)方面有点被绊倒,而不是仅仅一些一般的左连接。

编辑:这是我的意思的一个例子: 用户 table:

+------------------------+
| id                     |
+------------------------+
| 123456                 | --call this row a--
| 532614                 | --call this row b--
| 549481                 | --call this row c--
| 832482                 | --call this row d--
+------------------------+

房子table房子:

+------------------------+
| id| user_one| user_two |                   
+------------------------+
| 1 | 123456  | 532614   | -- important row --
| 2 | 549481  | 123456   |
| 3 | 532614  | 123456   |
| 4 | 549481  | 532614   |
+------------------------+

所以,在 运行 这个查询之后,我想 return 来自用户 table 的 c 行和 d 行,因为有一行 user_one是 123456 而 user_two 是房屋 table 中的 532614(重要行),所以我想从我的输出中排除 ID 为 532614 的用户。另外,我没有在输出中包含行 a,因为它等于 id 123456 本身。

抱歉,如果这是一个基本问题,我正在从 noSQL 迁移过来,但在掌握像这样更复杂的问题时仍然有些困难。

谢谢。

也请分享示例数据并输出您需要的。

我在您的查询中发现了一个问题。由于您使用的是左外连接,因此 user_one 不应出现在 where 子句中。你的查询应该是这样的

select users.id from users join houses on 1 = 1 and user_one != '123456';

我会在这里使用存在的逻辑:

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版本,则使用如下左反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 子句中断言没有找到这样的匹配项,表明用户是有效的(当然我们也检查用户是否 '123456' 正确。