下面是我的表格,称为“数据点”。我正在尝试检索具有相同“ 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。

mysql - 检索具有2个匹配的列和1个不同的行-LMLPHP

我知道这是一个重复的问题,实际上我有以下提供的链接之一供参考-但是这些解决方案都无法正常工作,因为我的查询永无休止。

以下是我的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

为了提高性能,请确保在sensorNumbertimeOfReading上具有复合索引:

CREATE INDEX ix_sn_tr on datapoints (sensorNumber, timeOfReading);

10-06 14:20