MySQL:加入 3 个表并按其中一个进行过滤

标签 mysql join blogs

我有三个包含以下列的表:

blog:  
id | title | body

categories:
id | title

blog_categories_join: 
blog_id | category_id

我正在使用此 MySQL 查询来获取前 8 篇博文并加入每篇博文的相应类别:

SELECT b.* 
GROUP_CONCAT(c.title ORDER BY c.id ASC SEPARATOR ', ') AS categories,
FROM blog b
LEFT OUTER JOIN blog_categories_join bcj ON bcj.blog_id = b.id
LEFT OUTER JOIN categories c ON c.id = bcj.category_id
GROUP BY b.title
ORDER BY b.date DESC LIMIT 8

这对我来说效果很好。但是,我也想获得特定类别的前 8 篇博文。所以我尝试添加一个 WHERE 子句:

SELECT b.* 
GROUP_CONCAT(c.title ORDER BY c.id ASC SEPARATOR ', ') AS categories,
FROM blog b
LEFT OUTER JOIN blog_categories_join bcj ON bcj.blog_id = b.id
LEFT OUTER JOIN categories c ON c.id = bcj.category_id
WHERE bcj.category_id = $id 
GROUP BY b.title
ORDER BY b.date DESC LIMIT 8

从某种意义上说,这是有效的,它只从指定的类别中提取博客,但我的 GROUP_CONCAT 不再包含博客所属的每个类别。它只包含 WHERE 子句中指定的类别。

我是否可以只查询属于指定类别的帖子,并按照我的表结构返回相应的类别?

最佳答案

您应该能够重新加入类别以使用 group_concat。

SELECT
    b.*
    GROUP_CONCAT(c2.title ORDER BY c2.id ASC SEPARATOR ', ') AS categories,
FROM blog b
LEFT OUTER JOIN blog_categories_join bcj ON bcj.blog_id = b.id
LEFT OUTER JOIN categories c ON c.id = bcj.category_id
LEFT OUTER JOIN categories c2 ON c2.id = bcj.category_id
WHERE c.category_id = $id
GROUP BY b.title
ORDER BY b.date
DESC LIMIT 8

关于MySQL:加入 3 个表并按其中一个进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19968514/

相关文章:

Android WebView 未加载博客

php - 导出所有产品的库存数量以在 Magento 中表现出色

javascript - 第二个请求的 Node -mysql 连接错误

正则表达式中的 MySQL 和单词边界

mysql - 我如何将此查询转换为使用子查询的查询?

php - 多对多没有给出结果

mysql - 表比较中的内连接多个条目

mysql - 选择随机行时的 SQL Join 帮助

blogs - 更改我的 Hugo 博客的主页/登陆页面

python - 为什么我收到此错误 'WSGIRequest' object has no attribute 'kwargs'?