我有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的评论出现,另一条评论为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 |
+---------+-----------+-------------+---------+--------------+---------+-----------+
提前感谢您的帮助
答案 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
。