如何编写SQL从profile-category、county、Sector三个分类法获取帖子数据?
解决多分类法联合查询帖子的问题
我来帮你搞定这个多分类查询的问题!你的原查询之所以失效,是因为犯了一个逻辑错误——你要求同一条分类关系记录同时属于三种不同的分类法(profile-category、county、Sector),还对应不同的term_id,这显然不可能,所以查询自然返回空结果。下面给你两种可行的解决方案:
方案一:多次关联分类表(直观易懂)
这种方式通过多次JOIN分类相关的表,每个分类法单独设置匹配条件,确保帖子同时满足三个分类要求:
SELECT p.* FROM bb_posts AS p -- 关联profile-category分类的关系、分类法和术语表 INNER JOIN bb_term_relationships AS r1 ON p.ID = r1.object_id INNER JOIN bb_term_taxonomy AS x1 ON r1.term_taxonomy_id = x1.term_taxonomy_id INNER JOIN bb_terms AS t1 ON x1.term_id = t1.term_id -- 关联county分类的关系、分类法和术语表 INNER JOIN bb_term_relationships AS r2 ON p.ID = r2.object_id INNER JOIN bb_term_taxonomy AS x2 ON r2.term_taxonomy_id = x2.term_taxonomy_id INNER JOIN bb_terms AS t2 ON x2.term_id = t2.term_id -- 关联Sector分类的关系、分类法和术语表 INNER JOIN bb_term_relationships AS r3 ON p.ID = r3.object_id INNER JOIN bb_term_taxonomy AS x3 ON r3.term_taxonomy_id = x3.term_taxonomy_id INNER JOIN bb_terms AS t3 ON x3.term_id = t3.term_id WHERE p.post_type IN ('post', 'profile') AND p.post_status = 'publish' -- 匹配profile-category下的term_id=577 AND x1.taxonomy = 'profile-category' AND t1.term_id = '577' -- 匹配county下的term_id=804 AND x2.taxonomy = 'county' AND t2.term_id = '804' -- 匹配Sector下的term_id=830 AND x3.taxonomy = 'Sector' AND t3.term_id = '830' ORDER BY p.post_date DESC;
方案说明
每个分类法单独关联一次bb_term_relationships、bb_term_taxonomy和bb_terms表,这样每个分类条件相互独立,确保帖子同时存在三个分类的关联记录。如果后续需要增加更多分类条件,只需要重复对应的JOIN和WHERE条件即可。
方案二:GROUP BY + HAVING(简洁高效)
如果需要匹配的分类数量较多,这种方式代码更简洁,通过子查询筛选出同时满足所有分类条件的帖子ID,再关联帖子表获取数据:
SELECT p.* FROM bb_posts AS p INNER JOIN ( -- 子查询:筛选出匹配任意目标分类的帖子关系记录,然后分组统计 SELECT r.object_id FROM bb_term_relationships AS r INNER JOIN bb_term_taxonomy AS x ON r.term_taxonomy_id = x.term_taxonomy_id INNER JOIN bb_terms AS t ON x.term_id = t.term_id WHERE (x.taxonomy = 'profile-category' AND t.term_id = '577') OR (x.taxonomy = 'county' AND t.term_id = '804') OR (x.taxonomy = 'Sector' AND t.term_id = '830') GROUP BY r.object_id -- 确保帖子同时匹配3种不同的分类法 HAVING COUNT(DISTINCT x.taxonomy) = 3 ) AS filtered_posts ON p.ID = filtered_posts.object_id WHERE p.post_type IN ('post', 'profile') AND p.post_status = 'publish' ORDER BY p.post_date DESC;
方案说明
- 子查询先获取所有匹配三个目标分类中任意一个的帖子关系记录;
- 按帖子ID分组,用
COUNT(DISTINCT x.taxonomy)统计每个帖子匹配的不同分类法数量; - 只有数量等于3的帖子,才是同时满足三个分类条件的目标帖子;
- 最后关联
bb_posts表获取完整的帖子数据。
额外提示
- 如果
term_id是数字类型,建议去掉单引号(比如t1.term_id = 577),避免类型转换影响性能; - 如果允许帖子在同一个分类法下关联多个术语,
COUNT(DISTINCT x.taxonomy)能确保统计的是不同分类法的数量,而不是总记录数; - 两种方案各有优劣:小数据量下方案一的查询速度可能更快,大数据量或多分类场景下方案二更简洁高效。
内容的提问来源于stack exchange,提问作者Shashi Verma
相关产品推荐
相关产品推荐

