传感器遍布我家,他们都将数据发送到mysql数据库。传感器每隔5分钟发送一次与DB进行通信的多个样本。
在桌面'传感器'上我有通用传感器信息(主键SensorId)
我需要从表'sensordata'中提取最新的SampleTime,并从桌子'sensormonitoring'中为表'传感器'上的每个Distinct SensorId提取最新的LastConnection。所以我可以将它们与PHP进行比较。
现在我正在使用PHP进行此操作,但我猜测必须有一种更简单,更有效的方法来执行此操作(每次运行页面时都会执行21次查询)
我有这个:
SELECT SensorId FROM sensors
然后在里面:
$query1 = "SELECT LastConnection
FROM sensormonitoring
WHERE SensorId =" . $row["SensorId"] . "
ORDER BY LastConnection desc
LIMIT 1";
$query2 = "SELECT SampleTime
FROM sensordata
WHERE SensorId =" . $row["SensorId"] ."
ORDER BY SampleTime desc
LIMIT 1";
有没有办法用单个SQL查询(可能使用JOINS?)避免长PHP代码?
最终结果将是这样的
SensorId LastConnection SampleTime
----------------------------------------------------
01 2014-04-20 09:38:56 2014-04-20 09:30:00
02 2014-04-20 09:35:05 2014-04-19 10:15:00
03 2014-04-20 09:33:27 2014-04-20 09:26:00
04 2014-04-20 09:45:12 NULL
对我的项目的一个额外解释:在这种情况下,我可以看到传感器02出现问题,因为最近的样本超过15分钟,但与数据库正常通信;传感器04正在通信,但根本没有收集样品。
这也可以说:有时SampleTime可能为NULL。
答案 0 :(得分:1)
您应该可以使用MAX在一个查询中执行此操作:
SELECT s.SensorId, MAX(m.LastConnection) AS LastConnection, MAX(d.SampleTime) AS SampleTime
FROM sensors s
LEFT JOIN sensormonitoring m on (s.SensorId = m.SensorId)
LEFT JOIN sensordata d on (s.SensorId = d.SensorId)
GROUP BY s.SensorId;
答案 1 :(得分:0)
这应该是一个有效的SQL语句,可以为您提供所需的所有信息:
SELECT SensorId,
(SELECT MAX(LastConnection) FROM sensormonitoring sm WHERE sm.SensorId = s.SensorId) AS LastConnection,
(SELECT MAX(SampleTime) FROM sensordata sd WHERE sd.SensorId = s.SensorId) AS SampleTime
FROM Sensors s
答案 2 :(得分:-2)
试试这个
SELECT sensormonitoring.SensorId, sensormonitoring.LastConnection, sensordata.SampleTime
FROM sensormonitoring
INNER JOIN sensordata
ON sensormonitoring.SensorId=sensordata.SensorId;