2017-10-05 10 views
1

私は以下に定義するように3つのテーブルを持つMySQLデータベースを持っています。タイムスタンプに基づくIF付きのMySQL SELECT

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

Readingは、データが収集された時のタイムスタンプを有する。 SensorReadingの所有者です。 DeviceSensorには、関係が開始されたときのタイムスタンプを含むDeviceSensorの間の関係が含まれます。

私のアーキテクチャでは、DeviceSensorとペアになっている場合、Sensorは前のDevicesを無視します。

私が必要とするのは、すべてのを照会し、それぞれの読み取り時に対応する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)]を返します。つまり、が14835279321507058076の間にあるReadingsは、1507058076の後にsensorId = 1Readingsを返します。sensorId = 2を返す必要があります。

+0

DeviceSensorに終了タイムスタンプが必要です。テーブルを変更する可能性はありますか? – MikeAinOz

+1

'Readings'が' sensorId'カラムを持っていれば、これはもっと簡単になります。 –

+0

@MikeAinOz可能ですが、「無」の場合はテーブルサイズを2倍にします。それが唯一の方法であれば、それは実行可能です。 – 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からレコードを選択します。 LIMITORDER BY ds.timestamp DESCは、最新のものを選択します。

+0

'Readings'テーブルに' sensorId'カラムを追加するのを忘れて、あなたのクエリがうまくいかないようにしました。しかし、 'AND ds.sensorId = r.sensorId'という行を変更すると、クエリは私が期待したものを正確に返すようになります。ありがとう! – Minoru

関連する問題