下面是我的表格,称为“数据点”。我正在尝试检索具有相同“ timeOfReading”和“ sensorNumber”的“ sensorValue”实例不同的实例。
例如:
sensorNumber sensorValue timeOfReading
5 5 6
5 5 6
5 6 10 <----same time/sensor diff value!
5 7 10 <----same time/sensor diff value!
结果应为:sensorNumber:5,timeOfReading:10。
我知道这是一个重复的问题,实际上我有以下提供的链接之一供参考-但是这些解决方案都无法正常工作,因为我的查询永无休止。
以下是我的SQL代码:
SELECT table1.sensorNumber, table1.timeOfReading
FROM datapoints table1
WHERE (SELECT COUNT(*)
FROM datapoints table2
WHERE table1.sensorNumber = table2.sensorNumber
AND table1.timeOfReading = table1.timeOfReading
AND table1.sensorValue != table2.sensorValue) > 1
AND table1.timeOfReading < 20;
请注意,我已将timeOfReading的范围设置为低至20。我也尝试同时为table1和table 2设置范围,但是无论我放置什么,查询都将一直运行到超时而不会显示结果。
该数据库包含大约700mb的数据,所以我认为我不能在合理的时间内在整个DB上运行它,我想知道这是否是罪魁祸首吗?
如果是这样,我如何适当地限制查询以有效地运行搜索?如果不是做错了什么不起作用?
Select rows having 2 columns equal value
编辑:
错误代码:2013。在查询600.000秒期间失去与MySQL服务器的连接
当我尝试再次运行查询时,除非重新启动,否则会出现此错误
错误代码:2006。MySQL服务器消失了0.000秒
最佳答案
您可以使用自联接来匹配同一表中的相关行。
SELECT DISTINCT t1.sensorNumber, t1.timeOfReading
FROM datapoints AS t1
JOIN datapoints AS t2
ON t1.sensorNumber = t2.sensorNumber
AND t1.timeOfReading = t2.timeOfReading
AND t1.sensorValue != t2.sensorValue
WHERE t1.timeOfReading < 20
DEMO
为了提高性能,请确保在
sensorNumber
和timeOfReading
上具有复合索引:CREATE INDEX ix_sn_tr on datapoints (sensorNumber, timeOfReading);