【问题标题】:How to filter on master table in a left join query如何在左连接查询中过滤主表
【发布时间】:2014-03-04 20:26:40
【问题描述】:

我有 2 个表 POST 和 COMMENT,
每个帖子都有 ID、TITLE、CATEGORY_ID 和 USER_ID 每个评论都有 ID、COMMENT、POST_ID 和 USER_ID

我想列出所有 category_id=2 和 comment.user_id=1 的帖子

CREATE TABLE post
    (`ID` int, `TITLE` varchar(9), `CATEGORY_ID` int, `USER_ID` int) 
;

INSERT INTO post
    (`ID`, `TITLE`, `CATEGORY_ID`, `USER_ID`)
VALUES
    (1, 'My post A', 1, 1),
    (2, 'My post B', 2, 1),
    (3, 'My post C', 2, 2)
;

CREATE TABLE comment
    (`ID` int, `COMMENT` varchar(12), `POST_ID` int, `USER_ID` int)
;

INSERT INTO comment
    (`ID`, `COMMENT`, `POST_ID`, `USER_ID`)
VALUES
    (1, 'My comment X', 1, 1),
    (2, 'My comment Y', 2, 1),
    (3, 'My comment Z', 1, 2)
;

此命令获取所有帖子,包括 category_id = 1 的帖子

    SELECT post.*, comment.comment, comment.post_id, comment.user_id c_user_id
FROM post
LEFT JOIN COMMENT
ON POST.id = COMMENT.post_id
AND COMMENT.user_id=1
AND POST.category_id =2

我明白了

+---------+-----------+-------------+---------+--------------+---------+-----------+
| USER_ID |   TITLE   | CATEGORY_ID | USER_ID |   COMMENT    | POST_ID | C_USER_ID | 
+---------+-----------+-------------+---------+--------------+---------+-----------+
| 1       | MY POST A | 1           | 1       | null         | null    | null      | 
| 2       | MY POST B | 2           | 1       | My Comment Y | 2       | 1         |  
| 1       | MY POST C | 2           | 2       | null         | null    | null      | 
+---------+-----------+-------------+---------+--------------+---------+-----------+

我想得到这个(所有带有 category_id = 2 的帖子,所以有 2 条记录,其中 user_id 的评论出现,其他评论为空,如下所示:

+---------+-----------+-------------+---------+--------------+---------+-----------+
| USER_ID |   TITLE   | CATEGORY_ID | USER_ID |   COMMENT    | POST_ID | C_USER_ID |  
+---------+-----------+-------------+---------+--------------+---------+-----------+
| 2       | MY POST B | 2           | 1       | My Comment Y | 2       | 1         | 
| 1       | MY POST C | 2           | 2       | null         | null    | null      |  
+---------+-----------+-------------+---------+--------------+---------+-----------+

提前感谢您的帮助

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    关于在 left outer joins 的 on 子句中添加条件的规则。 . .好吧,它适用于 second 表上的条件,而不是 first。所以,把这个条件放在where 子句中:

    SELECT post.*, comment.comment, comment.post_id, comment.user_id c_user_id
    FROM post LEFT JOIN
         COMMENT
         ON POST.id = COMMENT.post_id AND COMMENT.user_id=1
    WHERE POST.category_id = 2;
    

    left outer join 的工作方式从概念上讲是:在第一个表中取一行。然后在第二个表中查找符合on 条件的所有匹配行。保留所有比赛。如果没有匹配项,保留第一个表中的行。

    你猜怎么着。这仍然是逻辑,即使条件过滤了第一个表上的行。因此,根据第一个表中的条件过滤 left outer join 无效。

    所有这些同样适用于 right outer joins,所有表引用都颠倒了。

    【讨论】:

    • 感谢您的解释,正是我想要的@GordonLinoff
    猜你喜欢
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 2017-03-10
    • 2020-08-26
    • 2022-11-11
    • 2011-06-05
    • 2019-05-21
    相关资源
    最近更新 更多