MySQL JOIN与WHERE子句,不返回所有结果

时间:2012-09-25 01:28:09

标签: mysql left-join where-clause

我正在开发基于PHP / MySQL的'博文'系统,帖子可以有多个类别,我有2个表:

帖子:

PostId   Content
0        POST0
1        POST1
2        POST2
3        POST3

post_categories:

PostId   CategoryId
0        1
0        2
0        3
1        2
1        4
2        3
3        1

(我省略了一些栏目)
我还有第3个表“类别”,它们描述了类别,但这并不相关。

给出CategoryId(例如:2),我想在以下表格中返回包含该CategoryId的所有帖子:

PostId  Contents  CategoriesIds
0       POST0     1, 2, 3
1       POST1     2, 4

(必须返回0和1后的帖子,它们都有CategoryId 2)

问题是使用此查询:

SELECT p.PostId, p.Content, GROUP_CONCAT(pc.CategoryId SEPARATOR ',') AS CategoriesIds
FROM posts AS p
LEFT JOIN post_categories AS pc ON p.PostId=pc.PostId
WHERE pc.CategoryId = 2 GROUP BY p.PostId

这两个帖子都被退回但不是所有的类别ID,

PostId  Content   CategoriesIds
0       POST0     2
1       POST1     2

我想返回所有包含CategoryId 2的帖子,但仍然会返回这些帖子的所有CategoriesIds。

是否可以这样做?
感谢

2 个答案:

答案 0 :(得分:1)

看起来你需要从字段的选择中分离出categoryId = 2的帖子选择 - 尝试这样的事情:

SELECT p.PostId, p.Content,
GROUP_CONCAT(pc.CategoryId SEPARATOR ',') AS CategoriesIds

FROM posts AS p
LEFT JOIN post_categories AS pc ON p.PostId=pc.PostId

where p.PostId in 
  ( select PostId from post_categories where CategoryId = 2)

GROUP BY p.PostId

答案 1 :(得分:0)

不使用IN子句的最简单的解决方案是 SQLFiddle Demo