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

(一部の列を省略しました)
カテゴリを説明する 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 のすべての投稿を返したいのですが、それらの投稿のすべての 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

IN節を使用しない最も簡単な解決策は

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 に答える