Mysql 以更好的方式编写此SQL查询的好方法是什么?
非常混乱,但我创建此查询是为了查找一组行的摘要。Min和max timestamp很简单,但是为了找到速度为零而不是零的行数,我做了一个丑陋的破解。我相信有更好的方法可以做到这一点Mysql 以更好的方式编写此SQL查询的好方法是什么?,mysql,optimization,query-optimization,Mysql,Optimization,Query Optimization,非常混乱,但我创建此查询是为了查找一组行的摘要。Min和max timestamp很简单,但是为了找到速度为零而不是零的行数,我做了一个丑陋的破解。我相信有更好的方法可以做到这一点 更新:是什么?请参阅将由CodeIgniter的不成熟查询生成器替换。遗憾的是,它还不支持命名参数 应该包括DeviceID,这样才有意义。试试这个: SELECT MAX(timestamp) as end, MIN(timestamp) as start, (MAX(odometerKM
更新:是什么?请参阅将由CodeIgniter的不成熟查询生成器替换。遗憾的是,它还不支持命名参数 应该包括DeviceID,这样才有意义。试试这个:
SELECT
MAX(timestamp) as end,
MIN(timestamp) as start,
(MAX(odometerKM) - MIN(odometerKM)) as distanceTravelled,
( SELECT COUNT(*) FROM EventData WHERE speedKPH = 0 AND timestamp >= ? AND timestamp <= ? AND deviceID = ?) as stopsDuration,
( SELECT COUNT(*) FROM EventData WHERE speedKPH != 0 AND timestamp >= ? AND timestamp <= ? AND deviceID = ? ) as tripDuration,
(MAX(odometerKM) - MIN(odometerKM)) / ( SELECT fuelEconomy FROM Device WHERE deviceID = ?) as fuelConsumption
FROM EventData
WHERE deviceID = ? AND timestamp >= ? AND timestamp <= ?
我会去掉列子查询。您可以这样计算停止持续时间和tripDuration我暂时不考虑燃油消耗: 把所有这些放在一起,你会得到这样的结果,至少在纸上应该更快:
SELECT
(MAX(odometerKM) - MIN(odometerKM)) / dv.fuelEconomy as fuelConsumption
FROM
EventData,
(SELECT Device.fuelEconomy FROM Device WHERE DeviceId = ?) dv
WHERE deviceID = ? AND timestamp >= ? AND timestamp <= ?
难道您没有忘记包含deviceID=的条件吗?在你的前两个子查询中?@Yak:是的。让我编辑一下。另外,看起来相同的两个子查询实际上计算了事件数,而不是持续时间?为了进一步减少它,创建另一个带有WHERE条件的子查询表并完全消除WHERE不是更好吗?我考虑过这一点,但我不确定它是否会破坏start和/或end和/或distance值。我从来没有打算测试这个,所以我在做了100%确定的事情后就停止了。如果你能把它减少到这个程度,你一定要把它作为一个答案。请随意使用我的查询作为起点-我对此没有任何问题:
SELECT
MAX(timestamp) as end, MIN(timestamp) as start,
MAX(odometerKM) - MIN(odometerKM) as distanceTravelled,
COUNT(speedKPH = 0 AND timestamp >= ? AND timestamp <= ?) as stopsDuration
COUNT(speedKPH != 0 AND timestamp >= ? AND timestamp <= ?) as tripDuration
FROM EventData WHERE deviceID = ? AND timestamp >= ? AND timestamp <= ?
SELECT
(MAX(odometerKM) - MIN(odometerKM)) / dv.fuelEconomy as fuelConsumption
FROM
EventData,
(SELECT Device.fuelEconomy FROM Device WHERE DeviceId = ?) dv
WHERE deviceID = ? AND timestamp >= ? AND timestamp <= ?
SELECT
MAX(timestamp) as end, MIN(timestamp) as start,
MAX(odometerKM) - MIN(odometerKM) as distanceTravelled,
COUNT(speedKPH = 0 AND timestamp >= ? AND timestamp <= ?) as stopsDuration
COUNT(speedKPH != 0 AND timestamp >= ? AND timestamp <= ?) as tripDuration,
(MAX(odometerKM) - MIN(odometerKM)) / dv.fuelEconomy as fuelConsumption
FROM
EventData,
(SELECT Device.fuelEconomy FROM Device WHERE DeviceId = ?) dv
WHERE deviceID = ? AND timestamp >= ? AND timestamp <= ?