MySQL中不超时的子查询

MySQL中不超时的子查询,mysql,subquery,Mysql,Subquery,我对MySQL中的子查询有问题。查询运行超时: SELECT mac FROM cc_btdata WHERE DATE(time)="2014-09-29" AND mac NOT IN ( SELECT mac FROM cc_btdata WHERE DATE(time) BETWEEN ("2014-09-29" - INTERVAL 60 DAY) AND ("2014-09-29" - INTERVAL 1 DAY) GROUP BY mac) GROUP BY mac 当我一个接

我对MySQL中的子查询有问题。查询运行超时:

SELECT mac FROM cc_btdata WHERE DATE(time)="2014-09-29" AND mac NOT IN (
SELECT mac FROM cc_btdata WHERE DATE(time) BETWEEN ("2014-09-29" - INTERVAL 60 DAY) AND ("2014-09-29" - INTERVAL 1 DAY) GROUP BY mac) GROUP BY mac
当我一个接一个地调用查询时,它就工作了。但当我将它们称为子查询时就不是了。我也在我的开发环境中尝试了MariaDB中的查询,但在MySQL中没有

这个查询有什么问题

谢谢大家!

> P.Mac,我不认为需要任何组,也可以考虑替换不存在的,如


您也可以发布查询执行计划或解释计划。

您可以这样编写查询:

SELECT mac 
FROM cc_btdata b
WHERE NOT EXISTS (SELECT 1
                  FROM cc_btdata b2
                  WHERE b.mac = b2.mac AND
                        time >= '2014-09-29' - INTERVAL 60 DAY AND
                        time < '2014-09-29' - INTERVAL 1 DAY
                 ) AND
       time >= '2014-09-29' and time < '2014-09-29' + interval 1 day;

我使用having子句的原始表达式,因为MySQL无法利用having子句的索引。第一个版本可能会有更好的性能。

我认为在这种情况下,外部联接可以工作,并且可以避免依赖子查询:

SELECT DISTINCT mac
FROM cc_btdata
LEFT JOIN cc_btdata cc_btdata_check ON 
cc_btdata.mac = cc_btdata_check.mac 
AND DATE(cc_btdata_check.time) 
BETWEEN ("2014-09-04" - INTERVAL 60 DAY) AND ("2014-09-04" - INTERVAL 1 DAY)
WHERE DATE(cc_btdata.time)="2014-09-04"
AND cc_btdata_check IS NULL

谢谢-您的第二个代码运行得非常好,速度非常快。
select mac
from cc_btdata
where time >= '2014-09-29' - INTERVAL 60 DAY 
group by mac
having sum(date(time) = '2014-09-29') > 0 and
       sum(date(time) between '2014-09-29' - interval 60 DAY and '2014-09-29' - interval 1 day) = 0;
SELECT DISTINCT mac
FROM cc_btdata
LEFT JOIN cc_btdata cc_btdata_check ON 
cc_btdata.mac = cc_btdata_check.mac 
AND DATE(cc_btdata_check.time) 
BETWEEN ("2014-09-04" - INTERVAL 60 DAY) AND ("2014-09-04" - INTERVAL 1 DAY)
WHERE DATE(cc_btdata.time)="2014-09-04"
AND cc_btdata_check IS NULL