MySQL查询过滤分类后需保留完整关联分类列表的问题
搞定MySQL过滤分类后保留完整分类列表的问题
嘿,我来帮你解决这个头疼的问题~你遇到的核心问题是过滤时机不对:原查询直接在所有表关联完成后加WHERE c.CategoryName = 'Business',这会把该文章关联其他分类的行直接排除,导致GROUP_CONCAT只能收集到剩下的Business分类,自然看不到Marketing了。
正确的思路是:先找出所有包含Business分类的文章,再查询这些文章的全部关联作者和分类,这样就能保留完整的分类列表啦。
方法一:用子查询筛选目标文章ID
先通过子查询拿到所有属于Business分类的PostID,再基于这些ID查询完整信息:
SELECT p.TITLE AS `Post Title`, GROUP_CONCAT(DISTINCT u.USERNAME) AS Writers, GROUP_CONCAT(DISTINCT c.CategoryName) AS Categories FROM Posts p JOIN Posts_Writers pw ON pw.PostID = p.PostID JOIN Users u ON u.USERID = pw.USERID JOIN Posts_Categories pc ON pc.PostID = p.PostID JOIN Categories c ON c.Id = pc.CategoryId -- 先锁定包含Business分类的文章 WHERE p.PostID IN ( SELECT pc.PostID FROM Posts_Categories pc JOIN Categories c ON pc.CategoryID = c.Id WHERE c.CategoryName = 'Business' ) GROUP BY p.PostID, p.TITLE; -- 用PostID分组更靠谱,避免标题重复的情况
方法二:用EXISTS子句判断文章是否符合条件
这种写法逻辑更直观,直接判断当前文章是否关联了Business分类:
SELECT p.TITLE AS `Post Title`, GROUP_CONCAT(DISTINCT u.USERNAME) AS Writers, GROUP_CONCAT(DISTINCT c.CategoryName) AS Categories FROM Posts p JOIN Posts_Writers pw ON pw.PostID = p.PostID JOIN Users u ON u.USERID = pw.USERID JOIN Posts_Categories pc ON pc.PostID = p.PostID JOIN Categories c ON c.Id = pc.CategoryId WHERE EXISTS ( SELECT 1 FROM Posts_Categories pc_inner JOIN Categories c_inner ON pc_inner.CategoryID = c_inner.Id WHERE pc_inner.PostID = p.PostID AND c_inner.CategoryName = 'Business' ) GROUP BY p.PostID, p.TITLE;
再唠唠原查询为啥不行
原查询里的WHERE c.CategoryName = 'Business'是在所有表关联后过滤,相当于把Posts_Categories中关联Marketing的那行数据直接删掉了。最后GROUP_CONCAT只能拿到剩下的Business,自然看不到原本关联的Marketing啦。
用上面两种方法,先锁定符合条件的文章,再拉取它们的全部关联数据,就能完美解决你的需求啦~
内容的提问来源于stack exchange,提问作者Kroos
相关产品推荐
相关产品推荐

