首页 > 解决方案 > 如何通过在任何 SELECT 中将两个或更多列作为分组来创建父级和子级,但有效?

问题描述

假设我有类似于下面的数据,但完整的表格有:自动增量、测量值、日期、外键、描述性文本。在我创建的示例中,它只有自动增量、一个值、一个日期和两个代表设备和客户的外键。同一设备可能有多个客户,一个客户可能有多个设备。我想通过将这两个外键分组来创建历史。将使用一个新列来标识父级的 id,例如id_parent. 例子:

DROP TABLE IF EXISTS `test_stackoverflow`;
CREATE TABLE `test_stackoverflow`  (
  `auto` INT NOT NULL AUTO_INCREMENT,
  `description` VARCHAR(255),
  `fk_1` INT,
  `fk_2` INT,
  `valor` DOUBLE,
  `dt_analysis` DATETIME,
  PRIMARY KEY (`auto`) USING BTREE
);
INSERT INTO `test_stackoverflow` VALUES (1, 'Material 1', 1, 1, 1.300, '2019-04-02 12:04:40');
INSERT INTO `test_stackoverflow` VALUES (2, 'Material 2', 1, 2, 1.500, '2019-04-02 12:05:59');
INSERT INTO `test_stackoverflow` VALUES (3, 'Material 3', 2, 1, 1.400, '2020-04-02 12:06:34');
INSERT INTO `test_stackoverflow` VALUES (4, 'Material 4', 1, 1, 1.700, '2020-04-02 12:06:52');
INSERT INTO `test_stackoverflow` VALUES (5, 'Material 5', 1, 2, 1.800, '2020-04-02 12:07:22');

我得到了一些东西

WITH CTE AS (
    SELECT      
        auto, auto as id_parent, description, fk_1, fk_2, valor, dt_analysis
    FROM test_stackoverflow
    ORDER BY dt_analysis DESC
)
    SELECT
        T1.auto, CTE.id_parent, T1.description,T1.fk_1,T1.fk_2, T1.valor, T1.dt_analysis
    FROM test_stackoverflow AS T1
        INNER JOIN CTE ON CTE.fk_1 = T1.fk_1 AND CTE.fk_2 = T1.fk_2
    WHERE T1.auto <= CTE.id_parent
    ORDER BY id_parent, auto;

有用:

+------+-----------+--------------+------+------+-------+---------------------+
| auto | id_parent | description  | fk_1 | fk_2 | valor | dt_analysis         |
+------+-----------+--------------+------+------+-------+---------------------+
|    1 |         1 | Material 1   |    1 |    1 | 1.300 | 2019-04-02 12:04:40 |
|    2 |         2 | Material 2   |    1 |    2 | 1.500 | 2019-04-02 12:05:59 |
|    3 |         3 | Material 3   |    2 |    1 | 1.400 | 2020-04-02 12:06:34 |
|    1 |         4 | Material 1   |    1 |    1 | 1.300 | 2019-04-02 12:04:40 |
|    4 |         4 | Material 4   |    1 |    1 | 1.700 | 2020-04-02 12:06:52 |
|    2 |         5 | Material 2   |    1 |    2 | 1.500 | 2019-04-02 12:05:59 |
|    5 |         5 | Material 5   |    1 |    2 | 1.800 | 2020-04-02 12:07:22 |
+------+-----------+--------------+------+------+-------+---------------------+

但是对于真正的表,有各种“值”、“日期”、文本和其他信息,在大约 86000 条记录中,这个 SQL 并没有得出结论。它运行了几分钟而没有带来任何结果,即使我只使用逻辑所需的列,如创建和引用的示例中那样。有没有更有效的方法来解决这个问题?

标签: mysql

解决方案


推荐阅读