SQL 查询:这可以在没有嵌套查询的情况下完成吗?
SQL query: can this be done without a nested query?
下面的查询有效,但计算量很大(有 > 14k 条记录);这可以更有效地完成吗(例如,没有嵌套查询)?
基本上,它匹配同一 table 中的实例,这些实例代表一个开启命令 (log1) 和第一个关闭命令 (log2)。
SELECT log1.`deviceID`, log1.`timestamp` AS `on`, log2.`timestamp` as `off`
FROM `HC2_log_raw` log1, `HC2_log_raw` log2
WHERE log1.`newValue` > 0 AND log1.`oldValue` = 0 AND log2.`newValue` = 0 AND log1.`deviceID` = log2.`deviceID` AND
log2.`timestamp` =
(SELECT MIN(log3.`timestamp`)
FROM `HC2_log_raw` log3
WHERE log3.`timestamp` > log1.`timestamp` AND log3.`deviceID` = log1.`deviceID` AND log3.`newValue`=0)
谢谢!
看看这个。 afaik,where
子句比加入 on
条件更好。
SELECT log1.`deviceID`
,log1.`timestamp` AS `on`
,log2.`timestamp` AS `off`
FROM
`HC2_log_raw` log1
inner join `HC2_log_raw` log2
on
log1.`deviceID` = log2.`deviceID`
where
(
log1.`newValue` > 0
AND log1.`oldValue` = 0
AND log2.`newValue` = 0
AND log2.`timestamp` = (
SELECT MIN(log3.`timestamp`)
FROM `HC2_log_raw` log3
WHERE log3.`timestamp` > log1.`timestamp`
AND log3.`deviceID` = log1.`deviceID`
AND log3.`newValue` = 0
)
)
您可以尝试使用 JOIN 与 GROUP BY 和 MIN 函数来归档您的预期结果
SELECT log1.`deviceid`,
log1.`timestamp` AS `on`,
MIN(log2.`timestamp`) AS `off`
FROM `hc2_log_raw` log1
INNER JOIN `hc2_log_raw` log2
ON log1.`deviceid` = log2.`deviceid`
AND log1.`timestamp` < log2.`timestamp`
WHERE log1.`newvalue` > 0
AND log1.`oldvalue` = 0
AND log2.`newvalue` = 0
GROUP BY log1.`deviceid`, log1.`timestamp`
下面的查询有效,但计算量很大(有 > 14k 条记录);这可以更有效地完成吗(例如,没有嵌套查询)? 基本上,它匹配同一 table 中的实例,这些实例代表一个开启命令 (log1) 和第一个关闭命令 (log2)。
SELECT log1.`deviceID`, log1.`timestamp` AS `on`, log2.`timestamp` as `off`
FROM `HC2_log_raw` log1, `HC2_log_raw` log2
WHERE log1.`newValue` > 0 AND log1.`oldValue` = 0 AND log2.`newValue` = 0 AND log1.`deviceID` = log2.`deviceID` AND
log2.`timestamp` =
(SELECT MIN(log3.`timestamp`)
FROM `HC2_log_raw` log3
WHERE log3.`timestamp` > log1.`timestamp` AND log3.`deviceID` = log1.`deviceID` AND log3.`newValue`=0)
谢谢!
看看这个。 afaik,where
子句比加入 on
条件更好。
SELECT log1.`deviceID`
,log1.`timestamp` AS `on`
,log2.`timestamp` AS `off`
FROM
`HC2_log_raw` log1
inner join `HC2_log_raw` log2
on
log1.`deviceID` = log2.`deviceID`
where
(
log1.`newValue` > 0
AND log1.`oldValue` = 0
AND log2.`newValue` = 0
AND log2.`timestamp` = (
SELECT MIN(log3.`timestamp`)
FROM `HC2_log_raw` log3
WHERE log3.`timestamp` > log1.`timestamp`
AND log3.`deviceID` = log1.`deviceID`
AND log3.`newValue` = 0
)
)
您可以尝试使用 JOIN 与 GROUP BY 和 MIN 函数来归档您的预期结果
SELECT log1.`deviceid`,
log1.`timestamp` AS `on`,
MIN(log2.`timestamp`) AS `off`
FROM `hc2_log_raw` log1
INNER JOIN `hc2_log_raw` log2
ON log1.`deviceid` = log2.`deviceid`
AND log1.`timestamp` < log2.`timestamp`
WHERE log1.`newvalue` > 0
AND log1.`oldvalue` = 0
AND log2.`newvalue` = 0
GROUP BY log1.`deviceid`, log1.`timestamp`