如何在左连接查询中筛选主表

时间:2014-03-04 20:26:40

标签: mysql sql

我有2个表POST和COMMENT,
每个帖子都有ID,TITLE,CATEGORY_ID和USER_ID 每个评论都有ID,COM​​MENT,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的评论出现,另一条评论为null,如下所示:

+---------+-----------+-------------+---------+--------------+---------+-----------+
| 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      |  
+---------+-----------+-------------+---------+--------------+---------+-----------+

提前感谢您的帮助

1 个答案:

答案 0 :(得分:1)

关于将条件放入on的{​​{1}}子句的规则。 。 。好吧,它适用于第二个表上的条件,而不是第一个。因此,将该条件放在left outer join子句中:

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