2017-10-05 127 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