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';
如果要使用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'
正确。
我有两个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';
如果要使用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'
正确。