如何编写严格满足同一列多条件的两表关联SELECT查询
解决同时拥有两个标签的EntityID查询问题
哦,我懂你为啥原查询不行了——你写的WHERE taginfo.tag = "own" AND taginfo.tag = "rocking"根本不可能返回任何结果,毕竟一条记录里的tag字段不可能同时等于两个不同的值嘛!咱们换几个靠谱的思路来实现“筛选出同时拥有own和rocking标签的entityid”这个需求:
方法1:分组统计(最常用且高效)
这种方法先筛选出目标标签的关联记录,再按entityid分组,只保留拥有两个不同标签的条目:
SELECT c.entityid FROM companytagrel c JOIN taginfo t ON c.tagid = t.tagid WHERE t.tag IN ('own', 'rocking') GROUP BY c.entityid HAVING COUNT(DISTINCT t.tagid) = 2;
为啥这么写?
WHERE t.tag IN ('own', 'rocking')先把范围缩小到只和这两个标签相关的记录GROUP BY c.entityid把同一个实体的所有标签记录归为一组HAVING COUNT(DISTINCT t.tagid) = 2确保这个组里确实包含了两个不同的标签(避免同一个标签被重复关联的情况)
方法2:多次关联(直观易懂)
通过两次关联companytagrel和taginfo,直接找到同时存在两个标签关联的实体:
SELECT DISTINCT c1.entityid FROM companytagrel c1 JOIN taginfo t1 ON c1.tagid = t1.tagid AND t1.tag = 'own' JOIN companytagrel c2 ON c1.entityid = c2.entityid JOIN taginfo t2 ON c2.tagid = t2.tagid AND t2.tag = 'rocking';
注意点:
- 加上
DISTINCT是为了避免同一个entityid被重复返回(如果存在多条关联记录的话) - 这种写法逻辑很直接:先找到所有带
own标签的实体,再从中找出同时带rocking标签的
方法3:子查询嵌套(适合复杂场景扩展)
用子查询分别找出对应标签的tagid,再筛选同时匹配的entityid:
SELECT entityid FROM companytagrel WHERE tagid = (SELECT tagid FROM taginfo WHERE tag = 'own') AND entityid IN ( SELECT entityid FROM companytagrel WHERE tagid = (SELECT tagid FROM taginfo WHERE tag = 'rocking') );
适用场景:
如果后续需要添加更多标签条件,只需要继续嵌套AND entityid IN (...)即可,扩展性不错。
原查询的问题总结
LEFT JOIN在这里没必要:我们需要的是确实关联了标签的实体,用INNER JOIN更合适AND条件错误:同一行的tag不可能同时等于两个值,应该用IN或者分条件关联
内容的提问来源于stack exchange,提问作者Prabu M
相关产品推荐
相关产品推荐

