【发布时间】:2015-02-25 22:21:09
【问题描述】:
我有两张桌子
Sensorlist
id (int, PK)
alias (varchar)
Readings
sensorid (int)
value (decimal)
date (datetime)
id (bigint, PK)
读数表在 id、sensorid 和日期上有一个索引。这是在 MYSQL 中,在树莓派上运行。
我想获得一个列表,其中显示列表中的每个传感器,以及它们最近的读数以及过去 24 小时内的最小和最大读数。
我有以下两个查询,我将它们组合成一个数组并显示。我不太清楚如何将这两个作为一个查询来完成。第一个查询很慢。我怎样才能提高效率?
获取最新读数需要 27 秒:
select distinct s.alias, s.id, a.maxdate, r.value from sensorlist s
inner join
(
SELECT MAX(date) maxDate, sensorid FROM readings GROUP BY sensorid
) a on a.sensorid = s.id
inner join readings r on r.sensorid = s.id and r.date = a.maxdate
ORDER BY s.alias
查询 2 获取过去 24 小时内的最小值/最大值,这只需要 0.3 秒:
select distinct s.alias, s.id, max(value) as maxval, min(value) as minval from sensorlist s
inner join readings r on r.sensorid = s.id where r.date > DATE_SUB(NOW(), INTERVAL 24 HOUR) group by r.sensorid
我认为这是我连接子查询的方式。但我不知道如何不使用子查询,或者如何在一个查询中完成整个事情(如果这是一个更多高效路线?)
感谢您的任何建议, 查理
编辑-完成的查询(由下面的答案给出,但 MYSQL 不喜欢“minvalue”这个词,根据答案添加索引)
SELECT sensorlist.id, sensorlist.alias, a.maxval, a.minval, b.value AS lastvalue, b.date as recentdate
FROM (
SELECT sensorid, MAX(value) AS maxval, MIN(value) AS minval
FROM readings
WHERE date >= NOW() - INTERVAL 24 HOUR
GROUP BY sensorid
) AS a
JOIN (
select value, sensorid, date
FROM readings
JOIN
(
SELECT MAX(id) id FROM readings GROUP BY sensorid
) as m on m.id = readings.id
)
AS b ON a.sensorid = b.sensorid
JOIN sensorlist ON sensorlist.id = a.sensorid
非常感谢!
【问题讨论】:
标签: mysql sql time-series aggregate-functions