任何人都可以解释为什么第一个SQL查询在第二个查询给出结果时给出0

时间:2014-04-29 08:46:08

标签: mysql sql sequel

我有两个我认为应该等效的SQL查询:

SELECT COUNT(*) FROM (
  SELECT distinct(e.id) FROM entity as e 
  join organization_feature as o on o.entity_id = e.id 
  where exists (
    select * from entity where o.feature_id = 2086 and o.string_value is not null
  ) and ( o.feature_id = 2038 ) GROUP BY e.id 
) as res

这是第一个,这是第二个:

SELECT COUNT(*) FROM (
  SELECT distinct(e.id) FROM entity as e 
  join organization_feature as o on o.entity_id = e.id 
  where ( o.feature_id = 2038 ) 
  or (o.feature_id = 2086 and o.string_value is not null)
  GROUP BY e.id having count(*)=2
) as res

问题是,第一个给我0作为计数结果,而第二个给我13411.有关我的数据库结构的更多信息或更好地理解查询see here(如果人们想要我重新发布这里的信息,我很高兴)。

任何人都可以解释为什么它们不相同并提供一个"存在的地方"我能用的条款吗?

编辑:谢谢大家的帮助,感谢您的建议我意识到我应该使用:

SELECT COUNT(*) FROM (
  SELECT distinct(e.id) FROM entity as e 
  join organization_feature as o on o.entity_id = e.id 
  where exists (
    select * from organization_feature as of where of.feature_id = 2086 and of.string_value is not null and of.entity_id = e.id
  ) and ( o.feature_id = 2038 ) GROUP BY e.id 
) as res

完成我想要做的事情。因为我需要连接的第三个变量来完成我正在尝试的查询,这提供了一个与我尝试的query_2相同的解决方案。再次感谢大家。

3 个答案:

答案 0 :(得分:1)

在你提到的另一篇文章中,如果你看一下where exists子句的答案,你会发现在这个子句中在where where子句中的表之间进行了连接,至少主要联接中的一个表 - 您在第一个查询中没有这样做。 根据您发布的查询,第二个查询应该为您提供您感兴趣的结果。

答案 1 :(得分:1)

where exists (
    select * from entity where o.feature_id = 2086 and o.string_value is not null
  ) and ( o.feature_id = 2038 )  
第一个选择的

实际上应该是

where exists (
    select * from entity where o.feature_id = 2086 and o.string_value is not null
  ) or ( o.feature_id = 2038 ) 

因为您不能拥有id = 2086 AND id = 2038

的记录

答案 2 :(得分:1)

在第一个查询服务器中首先搜索

SELECT DISTINCT(e.id)
FROM entity               AS e
JOIN organization_feature AS o
ON o.entity_id = e.id
WHERE 
AND ( o.feature_id = 2038 )

然后为每个创建的记录执行

and EXISTS
(SELECT *
FROM entity
WHERE o.feature_id  = 2086
AND o.string_value IS NOT NULL
)  

在这种情况下,第一步的每条记录都有值o.feature_id = 2038,第二步总是假的