【问题标题】:MySQL query joining rows in same tableMySQL查询连接同一表中的行
【发布时间】:2020-02-08 18:21:36
【问题描述】:

我将传感器数据存储在 MySQL 表中。该表具有字段 id、timestamp、mac、temp 和湿度。

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 BY 时间戳并使用 GROUP_CONCAT 来获取该特定时间戳的各种传感器温度。在这种情况下,您的 WHERE 子句将更改为 where mac in ('mac1', 'mac2', ...)

标签: mysql


【解决方案1】:

另一种方法是按时间戳分组并使用 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 here 选项的更多信息。

【讨论】:

  • 我看到你提供了一个例子。 GROUP_CONCAT 将在一个列中为您提供所有结果,而不是在每个 mac 中分成单独的列(尽管您可以在该列中以可读的方式对其进行格式化)。如果您确实需要其他格式,那么您的第一种方法可能是唯一的方法,但是如果您的 mac 列表增加,那会变得很混乱。
  • 我明白了。刚刚尝试了您的建议,它确实返回了一列,但也只返回了一行......好吧。明白了:group by 而不是 order by。谢谢你的作品!
  • 哎呀,单行是因为我忘记按语句添加分组...答案已编辑。对于那个很抱歉。很高兴它有帮助。
猜你喜欢
  • 2013-04-23
  • 2019-04-04
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 2021-09-26
  • 2019-08-11
相关资源
最近更新 更多