首页 > 解决方案 > 将三个 MySQL 查询合并为一个以使其更快

问题描述

我有三个 MySQL 查询,如何将它连接到一个以更快地获得结果?是否可以使用单个查询来完成它,如果它比单独的三个查询更快?(我的表格中最多可以有 150 万条记录 - 3 个月期间的测量值)

样本数据:

+----+---------------------+-------+---------+
| 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 个数字我在查询中不做任何数学运算……那为什么会得到这个奇怪的值?

标签: mysqlsqlpivot-table

解决方案


我会主张在输入上修复它;从长远来看,这可能会更好。但是......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. 以不同的方式进行旋转可以避免这种情况。

推荐阅读