提取与列表(数组)中的精确值匹配的记录

时间:2019-04-08 07:03:17

标签: mysql

我有3个表(报告,标签,report_has_tags),需要选择仅提及标签的记录。以下是我正在使用的查询

SELECT r.*, rt.report_id, GROUP_CONCAT(rt.tag_id) as tag_ids, GROUP_CONCAT(t.tag_name) as tag_names 
FROM report r 
LEFT JOIN report_has_tag rt ON r.id=rt.report_id 
LEFT JOIN tags t ON rt.tag_id=t.id 
WHERE r.id in (select report_id from report_has_tag where tag_id IN (1,2) group by report_id having count(1) >1 ) 
GROUP BY r.id  
LIMIT 990 OFFSET 0

此查询返回包含标签1,2的所有记录以及包含标签3,4的记录。我只需要带有标签1、2而不是3或其他标签的记录。请查看所附图片https://ibb.co/Gdr6TDF

2 个答案:

答案 0 :(得分:1)

然后更改

having count(1) >1 

having count(1)=2 and not exists (select report_id from report_has_tag where tag_id not IN (1,2))

我的版本测试是否存在与给定记录关联的两个标签,并且没有其他标签与之关联。

答案 1 :(得分:1)

您只需要没有其他tag_id的report_id,可以通过以下查询来实现:

SELECT r.*, rt.report_id, GROUP_CONCAT(rt.tag_id) as tag_ids, GROUP_CONCAT(t.tag_name) as tag_names 
FROM report r 
LEFT JOIN report_has_tag rt ON r.id=rt.report_id 
LEFT JOIN tags t ON rt.tag_id=t.id 
WHERE r.id in (
    select report_id from report_has_tag group by report_id having count(1) >1 and max( tag_id ) < 3
) 
GROUP BY r.id  
LIMIT 990 OFFSET;

您只需要设置必须排除tag_id大于2的最大值。