mysql - 如何通过在任何 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 并没有得出结论。它运行了几分钟而没有带来任何结果,即使我只使用逻辑所需的列,如创建和引用的示例中那样。有没有更有效的方法来解决这个问题?
解决方案
推荐阅读
- node.js - 如何开始使用 Nodejs + Express 框架做微服务?
- java - 如何在同一个项目中从一个 Java Activity 移动到另一个 Kotlin Activity?
- java - 使用 builder.setView() 设置 AlertDialog 宽度以适合固定大小的 imageview 的大小
- c - 在子进程中通过管道读取输入时循环无法终止
- racket - 如何在 Racket 的合同退出条款中指定可选参数?
- amazon-web-services - 如何在 Terraform 中分配帐户
- php - 从外部 REST API 获取数据并在列表视图和详细视图中显示(自定义模块)
- excel - excel在excel中添加折扣,但有最大金额
- batch-file - 从特定文件夹中移动特定文件
- android - “无法访问主线程上的数据库,因为它可能会长时间锁定 UI。” 我的协程错误