1

我正在研究基于 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

(我省略了一些列)
我还有一个第三个表“类别”,它描述了类别,但这不相关。

给出一个 CategoryId(例如:2),我想返回包含该 CategoryId 的所有帖子,格式如下:

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

(post 0 和 post 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 的所有帖子,但仍返回这些帖子的所有 CategoriesId。

有可能这样做吗?
谢谢

4

2 回答 2

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
于 2012-09-25T01:42:16.980 回答
0

没有 usingIN子句的最简单的解决方案是

SELECT a.postID, c.content, 
       GROUP_CONCAT(b.categoryID ORDER BY b.categoryID ) CategoryList
FROM
    (
      SELECT  PostID
      FROM    post_categories b
      WHERE   CategoryID = 2
    ) a
    INNER JOIN post_categories b
      ON a.postID = b.postID
    INNER JOIN post c
      ON c.PostID = b.PostID
GROUP BY a.postID, c.content

SQLFiddle 演示

于 2012-09-25T01:49:41.130 回答