我有以下 SQL:
SELECT devices.device_id,
devices.description,
sensors.sensor_id,
sensors.description,
measurements.value,
measurements.valueDate,
measurements.created_at
FROM measurements
INNER JOIN sensors
ON sensors.id = measurements.sensor_id
INNER JOIN devices
ON devices.id = sensors.device_id
WHERE devices.device_id = '123456'
AND sensors.sensor_id = '100102'
AND measurements.created_at < (
SELECT created_at
FROM measurements
ORDER BY created_at DESC LIMIT 1
)
AND measurements.created_at > DATE_ADD((
SELECT created_at
FROM measurements
ORDER BY created_at DESC LIMIT 1
), INTERVAL - 48 DAY)
我认为问题出在最后两行...我想从引用内连接表而不是整个测量表的日期检索过去 48 天。 我不知道如何引用属于连接表结果的列。我应该给连接表起别名吗?
表格是:
Devices
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`device_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`description` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`country_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`city` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
Sensors
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`device_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`sensor_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`description` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`state` tinyint(1) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
Mesurements
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`sensor_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`valueDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
`value` float(8,2) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
最佳答案
可能的解决方案:
SELECT devices.device_id,
devices.description,
sensors.sensor_id,
sensors.description,
m.value,
m.valueDate,
m.created_at
FROM (
SELECT max( m.created_at ) max_date,
max( m.created_at ) - interval 48 day min_date
FROM measurements m
INNER JOIN sensors
ON sensors.id = m.sensor_id
INNER JOIN devices
ON devices.id = sensors.device_id
WHERE devices.device_id = '123456'
AND sensors.sensor_id = '100102'
) q
JOIN measurements m
ON m.created_at BETWEEN q.min_date AND q.max_date
INNER JOIN sensors
ON sensors.id = m.sensor_id
INNER JOIN devices
ON devices.id = sensors.device_id
WHERE devices.device_id = '123456'
AND sensors.sensor_id = '100102'
演示:http://www.sqlfiddle.com/#!2/73a5d/3
一些备注:
该查询使用以下比较来连接表:
- ONsensors.id=measurements.sensor_id
- ON devices.id =sensors.device_id
值得一提的是:
sensors.id
的类型为int(10)
,而measurements.sensor_id
的类型为 类型varchar(255)
devices.id
的类型为int(10)
,而sensors.device_id
的类型为 类型varchar(255)
这可能是表结构设计有缺陷,需要重新设计。这会影响性能,因为 MySql 必须不断执行从字符串到数字的转换(反之亦然)。
关于mysql - 如何在两个表的内部联接后引用列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19605268/