MySQL关联tags_table按tag_id与type过滤返回结果异常问题
问题原因
- 多次关联同一张标签表会产生笛卡尔积,导致
COUNT统计的是关联后的扩张行数,不是对应条件下的实际标签数量,所以HAVING条件的判断逻辑完全失效 - 修改后的查询存在语法错误:
ORDER BY g.id DESC中的表别名g不存在
正确解法(推荐:条件聚合写法,性能更高无笛卡尔积问题)
仅需关联一次标签表,通过条件聚合判断每个维度的规则是否满足:
SELECT p.id, p.title FROM `posts` p INNER JOIN `tags_table` t ON p.id = t.post_id GROUP BY p.id, p.title HAVING -- 要求type=1的标签中同时存在15和223(如果只要求存在任意一个,将=2改为>=1即可) COUNT(DISTINCT CASE WHEN t.type = 1 AND t.tag_id IN (15,223) THEN t.tag_id END) = 2 -- 要求type=2的标签中同时存在19和684 AND COUNT(DISTINCT CASE WHEN t.type = 2 AND t.tag_id IN (19,684) THEN t.tag_id END) = 2 -- 要求type=4的标签中存在5 AND COUNT(DISTINCT CASE WHEN t.type = 4 AND t.tag_id = 5 THEN t.tag_id END) = 1 ORDER BY p.id DESC;
逻辑说明
通过CASE语句筛选每个规则下符合条件的标签ID,用COUNT(DISTINCT)去重后计数,确保每个规则要求的标签都存在,完全匹配过滤需求。用提供的测试数据运行后,只会返回符合要求的Post title 1。
内容的提问来源于stack exchange,提问作者alexfsk
相关产品推荐
相关产品推荐

