2017-10-05 129 views
1

我有一个MySQL数据库,其中包含3个表格,定义如下。MySQL基于时间戳的IF选择

Readings: (_id, value, timestamp, sensorId) 
Sensor: (_id) 
DeviceSensor: (deviceId, sensorId, timestamp) 

Reading每个具有收集数据时的时间戳。 SensorReading的所有者。 DeviceSensor包含DeviceSensor之间的关系,包括关系开始时的时间戳。

在我的建筑,当DeviceSensor配对时,Sensor忽略前者Devices

我需要的是查询所有Readings并在每次阅读时将它们与相应的Device相关联。例如:

DeviceSensor = [(1,1,1483527932),(1,2,1507058076)] 
Sensor = [(1)] 
Readings = [(1,5,1483527932,1),(2,3,1493527932,1),(3,7,1507058076,1)] 

有了这些数据,我的查询将返回:[(1,5,1483527932,1),(2,3,1493527932,1),(3,7,1507058076,2)]。也就是说,Readingstimestamp14835279321507058076之间应该返回sensorId = 1Readings1507058076应该返回sensorId = 2

+0

您需要DeviceSensor上的结束时间戳。任何修改表格的机会? – MikeAinOz

+1

如果'Readings'有一个'sensorId'列,这会更简单。 –

+0

@MikeAinOz这是可能的,但它会使表格大小增加一倍以“无”。如果只有这样,那是可行的。 – Minoru

回答

2
SELECT r._id 
     ,r.value 
     ,r.timestamp 
     ,(SELECT max(ds.deviceId) as deviceId 
      FROM DeviceSensor as ds 
     WHERE ds.timestamp <= r.timestamp 
      AND ds.sensorId = r.sensorId 
     ORDER BY ds.timestamp DESC 
     LIMIT 1) as deviceId 
    FROM Readings as r 

子选择选择来自DeviceSensor这对于主选择的电流传感器,限制为那些具有配对到读取时间戳的记录。 LIMIT连同ORDER BY ds.timestamp DESC选择最新的这些。

+0

我忘了在'Readings'表中添加'sensorId'列,这样你的查询就无法工作。但改变行'AND ds.sensorId = r.sensorId'使查询返回正是我所期望的。谢谢! – Minoru