对于非常模糊的问题感到抱歉,但我的问题是我有三张不同的表。一个表包含用户信息,一个用于用户帖子,一个用户喜欢。我想从包含用户数据和帖子的表中选择数据,但只返回用户不喜欢的帖子,而不是用户自己发布的帖子。我曾尝试使用JOINS
的不同组合,但没有成功。
例如,我想为id = 1的用户选择行。
Table users:
+----+----------+
| id | username |
+----+----------+
| 1 | A |
| 2 | B |
| 3 | C |
+----+----------+
Table posts:
+----+---------+
| id | user_id |
+----+---------+
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | 2 |
| 6 | 3 |
+----+---------+
Table likes:
+----+---------+---------+
| id | post_id | user_id |
+----+---------+---------+
| 1 | 3 | 2 |
| 2 | 3 | 1 |
| 3 | 4 | 1 |
| 4 | 1 | 3 |
+----+---------+---------+
Result wantend:
+---------+----------+
| post_id | username |
+---------+----------+
| 5 | B |
| 6 | C |
+---------+----------+
我遇到的一个问题是我的查询也会返回post_id: 3
,因为user_id: 2
喜欢这个帖子。
我希望你理解我的问题。
提前致谢! /安德烈亚斯
答案 0 :(得分:2)
以下是针对not exists
使用likes
的查询的方法:
select p.id as post_id, u.username
from posts p join
users u
on p.user_id = u.id
where not exists (select 1
from likes l
where l.post_id = p.id and l.user_id = 1
) and
u.id <> 1;
答案 1 :(得分:1)
我认为你的数据模型不太正确,如果“喜欢”帖子会在“posts”表中添加一个用途。
但是,要回答原始问题,您可以通过以下方式排除“已赞”帖子:
SELECT p.post_id, p.user_id FROM
post p LEFT JOIN
likes l
ON p.post_id = l.post_id WHERE l.post_id IS NULL;
答案 2 :(得分:0)
要查找在另一个表中没有匹配的行,请使用LEFT JOIN
,然后选择外键为NULL
的行。
SELECT p.id as post_id, u.username
FROM posts p
LEFT JOIN likes l ON l.post_id = p.id AND l.user_id = 1
JOIN users u
WHERE u.id != 1 and l.post_id IS NULL
答案 3 :(得分:0)
SELECT p.id, u.username
FROM stackoverflow.posts p
JOIN stackoverflow.users u ON p.user_id = u.id
WHERE user_id <> 1
AND
p.id NOT IN
(
SELECT likes.post_id
FROM stackoverflow.likes
WHERE user_id = 1
);