在另一个表上选择不同的ID之后从两个表中提取值

时间:2014-04-21 17:12:10

标签: mysql select join distinct multiple-tables

传感器遍布我家,他们都将数据发送到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。

3 个答案:

答案 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;