连接同一表中的行的MySQL查询

连接同一表中的行的MySQL查询,mysql,Mysql,我将传感器数据存储在MySQL表中。该表包含字段id、时间戳、mac、温度和湿度 Id是唯一的自动增量索引,时间戳是输入数据的时间,Mac是传感器的Mac地址 因此,在每个时间戳为每个传感器创建一个条目。如果所有传感器都在工作,则时间戳将相等,但可能是某些传感器无法到达 我知道我想查询所有时间戳上所有传感器的温度。对于3个传感器,我提出了以下建议: SELECT a.timestamp, a.temp, b.temp, c.temp from `data` as a inner join da

我将传感器数据存储在MySQL表中。该表包含字段id、时间戳、mac、温度和湿度

Id是唯一的自动增量索引,时间戳是输入数据的时间,Mac是传感器的Mac地址

因此,在每个时间戳为每个传感器创建一个条目。如果所有传感器都在工作,则时间戳将相等,但可能是某些传感器无法到达

我知道我想查询所有时间戳上所有传感器的温度。对于3个传感器,我提出了以下建议:

SELECT a.timestamp, a.temp, b.temp, c.temp from `data` as a 
inner join data as b on a.timestamp = b.timestamp
inner join data as c on a.timestamp = c.timestamp 
where a.mac = 'xx:xz:xz:34:03:F0' and 
b.mac = 'xz:xx:xx:34:C6:99' and 
c.mac='xx:xx:xx:32:27:36' order by a.timestamp
样本数据:

INSERT INTO `data` (`id`, `mac`, `timestamp`, `temp`, `humidity`, `battery`) VALUES
(132, '58:2D:34:32:27:36', '2020-02-01 19:30:11', '23.2', '53.5', '0.0'),
(133, '58:2D:34:34:C6:99', '2020-02-01 19:30:11', '23.1', '51.4', '0.0'),
(134, '58:2D:34:34:03:F0', '2020-02-01 19:30:11', '24.1', '50.0', '0.0'),
(138, '58:2D:34:32:27:36', '2020-02-01 19:40:08', '23.2', '54.3', '0.0'),
(139, '58:2D:34:34:C6:99', '2020-02-01 19:40:08', '23.2', '51.6', '0.0'),
(140, '58:2D:34:34:03:F0', '2020-02-01 19:40:08', '24.1', '50.1', '0.0'),
(141, '58:2D:34:32:27:36', '2020-02-01 19:50:08', '23.3', '54.6', '0.0'),
(142, '58:2D:34:34:C6:99', '2020-02-01 19:50:08', '23.2', '51.4', '0.0'),
(143, '58:2D:34:34:03:F0', '2020-02-01 19:50:08', '24.0', '50.3', '0.0');
示例输出:

Timestamp.         , Mac1, Mac2, Mac3
2020-02-01 19:30:08, 24.0, 23.2, 23.0
2020-02-01 19:40:08, 24.0, 23.1, 23.0
2020-02-01 19:50:12, 24.1, 23.1, 23.0
但我认为应该/可能有更有效的方法

有什么想法吗


感谢

另一种方法是按时间戳分组,并使用group_CONCAT获取该时间戳的传感器数据

SELECT 
timestamp, 
GROUP_CONCAT(CONCAT(mac, ':', temp)) as temps
from data  
where mac in ('xx:xz:xz:34:03:F0', 'xz:xx:xx:34:C6:99', 'xx:xx:xx:32:27:36')
group by timestamp
order by timestamp

即使您坚持原来的方法,您也需要时间戳上的索引。有关GROUP_CONCAT选项的更多信息。

您能提供一些示例数据和示例输出吗?看起来您在第二行没有发布工作查询输入错误。也许您可以提供一些预期的输出,以帮助澄清您正在寻找的内容。我的直觉是,你真正想做的是按时间戳分组,并使用GROUP_CONCAT获取特定时间戳的各种传感器温度。在这种情况下,WHERE子句将更改为“mac1”、“mac2”中的WHERE mac……我看到您提供了一个示例。GROUP_CONCAT将在一列中为您提供结果,而不是在每个mac中分成单独的列,尽管您可以在该列中以可读的方式对其进行格式化。如果你确实需要其他格式,那么你的第一种方法可能是唯一的方法,但如果你的Mac电脑数量增加,这会变得一团糟。我明白了。刚刚尝试了你的建议,它确实返回了一列,但也只返回了一行。。。好的,我明白了:分组而不是按订单。谢谢,这很有效!哎呀,这一行是因为我忘了添加group by语句…答案已编辑。很抱歉。很高兴这有帮助。