今天用到要查询七天内都没有装机的门店信息,首先想到了用not in,先把装机的userid查出来,然后再id not in,但是这样就必须使用子查询,数据量少还可以,数据量大了的话,肯定效率特别低,因为MySQL需要为内层查询语句的查询结果建立一个临时表。然后外层查询语句再临时表中查询记录。查询完毕后,MySQL需要撤销这些临时表。因此,子查询的速度会受到一定的影响。如果查询的数据量比较大,这种影响就会随之增大。
首先使用:
select * from v9_wba_account where levels = 3 and id not in(select distinct userid from v9_wba_dev where days > 20150917)
然后尝试:
select * from v9_wba_account as user left join v9_wba_dev as dev on user.id=dev.userid where levels = 3
由于 LEFT JOIN 即使不满足 user.id=dev.userid 这个条件,也会把左表中的数据都查询出来,但是结果中 右表中的字段都是NULL而已
最后:
select * from v9_wba_account as user left join v9_wba_dev as dev on user.id=dev.userid where levels = 3 and dev.id is NULL
最后再排除下右表不为 null 的就是正确的了
select * from v9_wba_account as user left join v9_wba_dev as dev on user.id=dev.userid and dev.days >= 20150918 where levels = 3 and dev.id is NULL;
ON 后面是右表的查询条件