mysql - 将三个 MySQL 查询合并为一个以使其更快
问题描述
我有三个 MySQL 查询,如何将它连接到一个以更快地获得结果?是否可以使用单个查询来完成它,如果它比单独的三个查询更快?(我的表格中最多可以有 150 万条记录 - 3 个月期间的测量值)
id
- 自动增量,intphase
- tinyint,可能只有 1,2 或 3time
- 日期时间,每个阶段组 1、2、3 的时间相同voltage
- 漂浮
样本数据:
+----+---------------------+-------+---------+
| id | time | phase | voltage |
+----+---------------------+-------+---------+
| 1 | 2021-01-31 19:55:01 | 1 | 235.77 |
| 2 | 2021-01-31 19:55:01 | 2 | 237.94 |
| 3 | 2021-01-31 19:55:01 | 3 | 224.63 |
| 4 | 2021-01-31 19:55:06 | 1 | 236.41 |
| 5 | 2021-01-31 19:55:06 | 2 | 238.17 |
| 6 | 2021-01-31 19:55:06 | 3 | 224.61 |
| 7 | 2021-01-31 19:55:11 | 1 | 236.45 |
| 8 | 2021-01-31 19:55:11 | 2 | 237.87 |
| 9 | 2021-01-31 19:55:11 | 3 | 223.4 |
+----+---------------------+-------+---------+
查询 #1:
SELECT time, voltage AS L1
FROM measurements
WHERE phase = 1
ORDER BY id
查询 #2:
SELECT time, voltage AS L2
FROM measurements
WHERE phase = 2
ORDER BY id
查询 #3:
SELECT time, voltage AS L3
FROM measurements
WHERE phase = 3
ORDER BY id
之后的结果应该是这样的:
+----+---------------------+--------+--------+--------+
| id | time | L1 | L2 | L3 |
+----+---------------------+--------+--------+--------+
| 1 | 2021-01-31 19:55:01 | 235.77 | 237.94 | 224.63 |
| 2 | 2021-01-31 19:55:06 | 236.41 | 238.17 | 224.61 |
| 3 | 2021-01-31 19:55:11 | 236.45 | 237.87 | 223.4 |
+----+---------------------+--------+--------+--------+
编辑:毕竟,我有一个查询:
SELECT
time,
GROUP_CONCAT(IF(phase = 1, voltage, NULL)) AS 'L1',
GROUP_CONCAT(IF(phase = 2, voltage, NULL)) AS 'L2',
GROUP_CONCAT(IF(phase = 3, voltage, NULL)) AS 'L3'
FROM
`measurements`
GROUP BY
time
现在结果看起来像:
+---------------------+--------------------+--------------------+--------------------+
| time | L1 | L2 | L3 |
+---------------------+--------------------+--------------------+--------------------+
| 2021-01-31 19:55:01 | 235.77000427246094 | 237.94000244140625 | 224.6300048828125 |
| 2021-01-31 19:55:06 | 236.41000366210938 | 238.1699981689453 | 224.61000061035156 |
| 2021-01-31 19:55:11 | 236.4499969482422 | 237.8699951171875 | 223.39999389648438 |
+---------------------+--------------------+--------------------+--------------------+
为什么现在电压值如此不准确,所有电压存储值在小数点后最多为 2 个数字我在查询中不做任何数学运算……那为什么会得到这个奇怪的值?
解决方案
我会主张在输入上修复它;从长远来看,这可能会更好。但是......SELECTs
您还需要对数据做些什么?
CREATE TABLE measurements (
dt DATETIME NOT NULL,
v1 DECIMAL(5,2) NOT NULL, -- or whatever is appropriate; FLOAT is a reasonable option
v2 DECIMAL(5,2) NOT NULL,
v3 DECIMAL(5,2) NOT NULL,
PRIMARY KEY (dt)
) ENGINE=InnoDB
笔记:
- 如果还有其他列,我们需要了解它们
- 如果数据以 3 条记录的形式出现,则要么收集它们并执行单条记录,要么
INSERT
执行 1INSERT
和 2条UPDATEs
。对于后一种情况,考虑NULL
. - “235.77000427246094”与 MySQL 决定在
DOUBLE
. 以不同的方式进行旋转可以避免这种情况。
推荐阅读
- kubernetes - 如何在 K8s 服务中从容器中公开特定路径?
- java - 无法访问传递给 ScriptEngine 的 Java 对象的属性
- flutter - 如何通过 Flux 将对象更改传达给 Sping MongoDB Reactive 中的 Websocket
- asp.net - 将 DateTime 从 ASP.NET 发送到 angularjs 作为结构,而不是字符串
- docker - Nginx 反向代理映射到多个前端和后端
- swift - SwiftUI 视图更新
- openam - OPENAM - ID_TOKEN 无法获取会话信息
- ldap - ldap 支持多少节点复制 redhat 7.9
- reactjs - 使用 react-hook 在 safari 上设置动态图标
- arrays - Swift - 使用布尔值和可选日期对人员数组进行排序