MySQL中如何基于另一张表的多组时间区间过滤目标表?查询报错解决方案求助
看起来你是想从camarinas表中找出所有data字段落在ort_ocas表任意一个时间区间(ort到ocas)内的记录对吧?咱们来一步步解决你的问题:
正确的查询语句
最直接高效的方式是使用JOIN关联两个表,让数据库直接匹配每个时间区间:
SELECT DISTINCT c.* FROM camarinas c JOIN ort_ocas oo ON c.`data` BETWEEN oo.ort AND oo.ocas;
如果你的camarinas记录不会同时落在多个ort_ocas区间里,也可以去掉DISTINCT来提升查询速度。
为什么你的之前的语句会报错?
- 第一条语句的问题:
(select ort from ort_ocas)和(select ocas from ort_ocas)会返回多行结果,但BETWEEN运算符只能和单个值组合使用,数据库无法确定用哪一行的区间来做比较,所以抛出了Error Code: 1242. Subquery returns more than 1 row错误。 - 第二条语句的问题:嵌套的子查询写法效率极低,尤其是当两张表数据量较大时,会导致查询耗时过长,超过了MySQL的连接超时阈值,最终触发
Error Code: 2013. Lost connection to MySQL server during query错误。
优化建议
为了让这个查询跑得更快,建议给以下字段添加索引:
- 给
camarinas.data``字段加普通索引 - 给
ort_ocas.ort和ort_ocas.ocas字段加联合索引(或者各自加普通索引)
这样数据库可以快速定位符合条件的记录,避免全表扫描带来的性能问题。
内容的提问来源于stack exchange,提问作者Francisco J Garcia Corbeira
相关产品推荐
相关产品推荐

