带子查询的IN子句不按预期工作

时间:2016-12-13 07:48:13

标签: mysql

我有一个MySQL查询,我认为会引发异常,但事实并非如此。只想找出原因?查询是:

select count(distinct uid) 
from nov_visit_20161201 
where pv_listen>0
and uid in (select distinct uid from nov_visit_20161120 where pv_listen>0);

问题是表nov_visit_20161120没有pv_listen列,但查询效果很好。当我单独运行子查询时:

select distinct uid from nov_visit_20161120 where pv_listen>0

我得到了这个:“'where子句'中的未知列'pv_listen'。”

任何人都可以告诉我为什么?

2 个答案:

答案 0 :(得分:1)

我几次观察同样的事情,解释可能是,子查询中的pv_listen指的是主查询表。

考虑一种情况,您希望运行使用主查询列中的值的子查询,您如何编写它?你只需将列的名称放在子查询中,并在那里使用数据行的列值。因此,当在Sub查询表/数据集中找不到列时,它认为该列属于主查询,并且在您的情况下它发现相同。因此没有错误。

所以,它实际上是以

运行它
select count(distinct uid) 
from nov_visit_20161201 
where pv_listen>0
and uid in (select distinct uid from nov_visit_20161120);

由于sub query中的过滤器不会过滤任何记录。

答案 1 :(得分:0)

如果表中不存在该列,只需将其从where条件中删除:

select count(distinct uid) 
from nov_visit_20161201 
where pv_listen>0
and uid in (select distinct uid from nov_visit_20161120);