2012-09-25 148 views
1

我工作的PHP/MySQL的基於「博客文章」系統,該職位可以有多個類別,我有2個表:MySQL的聯接與WHERE子句,不返回所有結果

帖子:

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 

(我省略了一些列)
我也有一個第三表「類別」中,描述了類別,但是這並不releva NT。

給人一種類別編號(如:2),我想返回一個包含所有職位,類別ID,下面的形式:

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

(兩個後0和後1必須返回,它們都具有類別編號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。

有沒有可能這樣做?
感謝

回答

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

我認爲這也將工作:HTTP: //sqlfiddle.com/#!2/46036/11 – Jamie

+0

非常感謝,這工作,我不習慣使用'嵌套'查詢:P –

0

的simpliest的解決方案,而無需使用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 Demo

+0

謝謝,這也適用。 –

相關問題