MySQL - 如果在另一个表上匹配,则从一个表中排除所有行

时间:2014-02-28 01:41:38

标签: mysql sql

对于非常模糊的问题感到抱歉,但我的问题是我有三张不同的表。一个表包含用户信息,一个用于用户帖子,一个用户喜欢。我想从包含用户数据和帖子的表中选择数据,但只返回用户不喜欢的帖子,而不是用户自己发布的帖子。我曾尝试使用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喜欢这个帖子。

我希望你理解我的问题。

提前致谢! /安德烈亚斯

4 个答案:

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