Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 以更好的方式编写此SQL查询的好方法是什么?_Mysql_Optimization_Query Optimization - Fatal编程技术网

Mysql 以更好的方式编写此SQL查询的好方法是什么?

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

非常混乱,但我创建此查询是为了查找一组行的摘要。Min和max timestamp很简单,但是为了找到速度为零而不是零的行数,我做了一个丑陋的破解。我相信有更好的方法可以做到这一点


更新:是什么?请参阅将由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 <= ?