1

我需要你的帮助。我必须进行查询,然后只查看我的 id 1 不存在于表 users_blocked 上的人。

我试过这样:

SELECT 
U.first_name, U.sex, U.age, U.id, UB.request_user_id, UB.block_user_id
FROM users U, users_blocked UB
WHERE U.sex <> 'm'
AND NOT (UB.request_user_id = U.id AND UB.block_user_id = 1)

但它不起作用

我怎样才能看到表 users 上的刚刚记录 32?

Table: users

id  | first_name  | sex | age
1   | Mark        | m   | 32
2   | Alice       | f   | 26
23  | Lory        | f   | 24
32  | Jenny       | f   | 25


Table: users_blocked

id | request_user_id | block_user_id
1  | 2               | 1
2  | 23              | 1
4

4 回答 4

0

如果我理解正确,您需要加入users两次users_blocked,因为您想使用两个不同的列加入(因为您希望在 users_blocked 中没有记录的用户,在这些列中的任何一个中:request_user_idblock_user_id)。

您应该使用LEFT JOIN(如果您的第一个表SELECT是用户),因为首先您需要选择所有用户;如果您使用 INNER JOIN,则不会users_blocked选择任何没有记录的用户。

一旦你有了它,你就可以过滤掉所有block_user_idrequest_user_id都为 NULL 的记录。我建议您在没有WHERE 子句的情况下运行查询,并SELECT *更清楚地了解它是如何(以及为什么)工作的。

SELECT * 
FROM users u 
LEFT JOIN users_blocked blocked ON blocked.block_user_id = u.id
LEFT JOIN users_blocked requester ON requester.request_user_id = u.id
WHERE blocked.block_user_id IS NULL AND requester.request_user_id IS NULL
于 2013-08-05T12:33:57.467 回答
0

大概

SELECT u.id FROM users u 
INNER JOIN users_blocked ub ON u.id = ub.request_user_id
WHERE u.sex <> 'm' and ub.block_user_id <> 1
于 2013-08-05T10:10:53.710 回答
0
Select * from users u join users_blocked ub on u.id = ub.request_user_id where u.sex <> 'm' and ub.block_user_id != 1
于 2013-08-05T10:08:54.190 回答
0

如果我正确理解了您的问题,您想搜索 block_user_id 不等于 1 并且两个表中都存在记录的所有记录。下面提到的查询将对您有所帮助

尝试这个:

SELECT 
    U.first_name, U.sex, U.age, U.id, UB.request_user_id, UB.block_user_id
FROM users U
INNER JOIN users_blocked UB ON U.id = UB.block_user_id
WHERE U.sex <> 'm' AND UB.block_user_id != 1
于 2013-08-05T10:07:46.217 回答