【问题标题】:MySQL JOIN with WHERE clause, not returning all resultsMySQL JOIN 与 WHERE 子句,不返回所有结果
【发布时间】:2012-09-25 01:28:08
【问题描述】:

我正在开发基于 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。

可以吗?
谢谢

【问题讨论】:

    标签: mysql left-join where-clause


    【解决方案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
    

    【讨论】:

    • 非常感谢,这行得通,我不习惯使用“嵌套”查询:P
    【解决方案2】:

    不使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 2018-08-25
      • 1970-01-01
      相关资源
      最近更新 更多