Mysql SQL在多个表上选择一个值
我使用6个表来测量传感器Mysql SQL在多个表上选择一个值,mysql,sql,join,multiple-tables,Mysql,Sql,Join,Multiple Tables,我使用6个表来测量传感器 DEVICES id imei name 1 123456789 device1 BMP085 id deviceId date time pressure altitude tempC tempF 1 1 2014-02-21 20:01:02 000.00 000.00 00.00 00.00 GPS id deviceId date time latitude longit
DEVICES
id imei name
1 123456789 device1
BMP085
id deviceId date time pressure altitude tempC tempF
1 1 2014-02-21 20:01:02 000.00 000.00 00.00 00.00
GPS
id deviceId date time latitude longitude timeUtc timeFix altitude eps epx epv ept speed climb track mode satellites
1 1 2014-02-21 20:01:02 0.000000 0.000000 00:00:00 00:00:00 0.00 0.000 0.000 0.000 0.000 0.000 0.000 0.00 0 0
HIH6130
id deviceId date time humidity tempC tempF
1 1 2014-02-21 20:01:02 00.00 00.00 00.00
MINIMU9V2
id deviceId date time heading tempC tempF xAngle yAngle zAngle xAccel yAccel zAccel xMagn yMagn zMagn
1 1 2014-02-21 20:01:02 000.00 00.00 00.00 00.000 00.000 00.000 00.000 00.000 00.000 00.000 00.000 00.000
RASPI
id deviceId date time tempC tempF
1 1 2014-02-21 20:01:02 00.00 00.00
我想选择表BMP085、GPS、HIH6130、MINIMU9V2和RASPI中设备ID=1的所有匹配数据集。应该只显示此设备的数据集。
此外,我想选择表BMP085、GPS、HIH6130、MINIMU9V2和RASPI的所有匹配数据集,这些数据集的日期=2014-02-21,时间>=20:01:00和='20:01:00'
和t2.time您确定您的数据集结果是错误的吗?当您连接许多表时,很可能会在表中重复结果,这会使您的行显示不止一次 检查时:
SELECT t1.imei, t1.name,
t2.date, t2.time, t2.pressure, t2.altitude, t2.tempC, t2.tempF
FROM hab_DEVICES t1
LEFT JOIN hab_BMP085 t2 ON ( t1.id = t2.deviceId AND t1.id = 1 )
WHERE t2.date = '2014-02-21'
AND t2.time >= '20:01:00'
AND t2.time <= '20:01:30'
检查这把小提琴:
我假设表2中的时间是“主时间”,但您可以使用对您更有意义的任何时间。您能用一些数据和表的描述编写一个SQLFIDLE()吗?找到解决方案会有很大帮助这是我的小提琴,已经包括了Chococroc建议的内部连接:日期是否应该以某种方式相互关联?我每15秒同时记录一次所有传感器的传感器数据,因此我想获得在特定时间点为所有传感器设置的数据集。好的,我做到了,问题是连接键:你还需要包括时间。检查答案中的更新,XDI正在使用内部联接。给定的语句提供了63个数据集。添加GPS表可提供8064个数据集。添加HIH6130表可提供1032192个数据集。除了DEVICES表之外,所有表都有一个关于id、deviceId、日期和时间的索引,其中id是主键。
SELECT t1.imei, t1.name,
t2.date, t2.time, t2.pressure, t2.altitude, t2.tempC, t2.tempF
FROM hab_DEVICES t1
LEFT JOIN hab_BMP085 t2 ON ( t1.id = t2.deviceId AND t1.id = 1 )
WHERE t2.date = '2014-02-21'
AND t2.time >= '20:01:00'
AND t2.time <= '20:01:30'
SELECT t1.imei, t1.name,
t2.date, t2.time, t2.pressure, t2.altitude, t2.tempC, t2.tempF,
t3.latitude, t3.longitude, t3.timeUtc, t3.timeFix, t3.altitude, t3.eps, t3.epx, t3.epv, t3.ept, t3.speed, t3.climb, t3.track, t3.mode, t3.satellites,
t4.humidity, t4.tempC, t4.tempF,
t5.heading, t5.tempC, t5.tempF, t5.xAngle, t5.yAngle, t5.zAngle, t5.xAccel, t5.yAccel, t5.zAccel, t5.xMagn, t5.yMagn, t5.zMagn,
t6.tempC, t6.tempF
FROM hab_DEVICES t1
INNER JOIN hab_BMP085 t2
ON (t1.id = t2.deviceId AND t1.id = 1 )
INNER JOIN hab_GPS t3
ON (t1.id = t3.deviceId AND t2.date = t3.date AND t2.time = t3.time AND t1.id = 1)
INNER JOIN hab_HIH6130 t4
ON (t1.id = t4.deviceId AND t2.date = t4.date AND t2.time = t4.time AND t1.id = 1)
INNER JOIN hab_MINIMU9V2 t5
ON (t1.id = t5.deviceId AND t2.date = t5.date AND t2.time = t5.time AND t1.id = 1)
INNER JOIN hab_RASPI t6
ON (t1.id = t6.deviceId AND t2.date = t6.date AND t2.time = t6.time AND t1.id = 1)
WHERE t2.date = '2014-02-21'
AND t2.time >= '20:01:00'
AND t2.time <= '20:01:30'