mysql - 如何在两个表的内部联接后引用列?

标签 mysql sql

我有以下 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/

相关文章:

SQL 聚合连接和子查询优化

sql - XML 模式中的任何元素都会阻止 XQuery

php - 从需要帮助的表中获取好友详细信息

php - 基于多个复选框状态构建 SQL 查询

mysql - 获取按 12 周时间段分组的数据

mysql - 按 SQL IN() 子句中的值顺序排序

sql - PostgreSQL 简单触发器问题

MySQL IF 语句查询问题

mysql - 年度季度内的值总和

sql - 一张400GB表,一次查询——需要调优思路(SQL2005)