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

标签 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

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

给出一个 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。

有可能吗?
谢谢

最佳答案

看起来您需要将 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

关于带有 WHERE 子句的 MySQL JOIN,不返回所有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12575080/

相关文章:

php - 我想按最近的数字排序

php - 当条件设置时,Android fcm接收来自mysql的通知

mysql - Codeigniter db 无法在数组中工作

mysql - 如何连接表以选择连接表中的最大行?

mysql - LEFT OUTER JOIN 在第二张表上使用 WHERE 子句,不影响第一张表

mysql - 在 mysql 中使用 group by 和 count =1 更新表

sql - Where 和 Join on Id 之间的区别

django - django 中带有额外条件的左外连接

mysql - 如何查询mysql where子句中字段中的星号(*)字符

function - Haskell 中 where 表示法的好处