【发布时间】:2020-10-22 01:40:17
【问题描述】:
我使用的是 MySQL 8.0 版。
我有 2 张桌子:approvals 和 activities
approvals 表与activities 表是一对多的关系,即:一个approvals 记录可以在activities 表中有多条记录。
在approvals 表中创建记录之前和之后都会在activities 表中创建记录。在创建approvals 记录之前创建activities 记录是可以的,因为activities 表实际上绑定到另一个对这个问题不重要的表并且approvals 信息在前更新-approvals 记录创建后的现有activities 表记录。
我要做的是编写一个查询,该查询将显示approvals 记录信息,然后还显示activities 表中在@ 之前和之后创建的记录的记录信息987654338@ 记录已创建。
I have already mocked out the tables and my query on db-fiddle here.
以下是创建和填充approvals 和activities 表的脚本:
CREATE TABLE `approvals` (`id` INTEGER NOT NULL AUTO_INCREMENT, `created` DATETIME, PRIMARY KEY(`id`));
CREATE TABLE `activities` (`id` INTEGER NOT NULL AUTO_INCREMENT, `approvalId` INTEGER, `created` DATETIME, PRIMARY KEY(`id`));
INSERT INTO `approvals` (`created`)
VALUES
('2020-10-04 10:30:05'),
('2020-10-04 10:42:21'),
('2020-10-05 11:24:47'),
('2020-10-06 15:35:35');
INSERT INTO `activities` (`approvalId`, `created`)
VALUES
(1, '2020-09-30 04:24:14'),
(1, '2020-10-01 12:21:05'),
(1, '2020-10-06 12:21:05'),
(1, '2020-10-07 14:29:22'),
(2, '2020-09-28 05:33:10'),
(2, '2020-10-04 09:21:05'),
(2, '2020-10-04 15:27:35'),
(2, '2020-10-07 01:44:12'),
(3, '2020-09-22 04:24:14'),
(3, '2020-10-04 12:21:05'),
(3, '2020-10-06 12:21:05'),
(3, '2020-10-07 14:29:22'),
(4, '2020-09-21 04:24:14'),
(4, '2020-10-04 14:21:05'),
(4, '2020-10-10 12:21:05'),
(4, '2020-10-12 14:29:22');
这是我写的查询:
SELECT `der`.`id` AS `aprvId`,
`oact1`.`id` AS `preActivityId`,
`oact1`.`created` AS `prevActivityCreated`,
`der`.`created` AS `appCreatedDate`,
`oact2`.`id` AS `postActivityId`,
`oact2`.`created` AS `postActivityCreated`
FROM (
SELECT `app`.`id`,
MAX(`act1`.`created`) AS `mxDate`,
`app`.`created`,
'' AS `mnDate`
FROM `approvals` AS `app`
JOIN `activities` AS `act1` ON `act1`.`approvalId` = `app`.`id`
WHERE `act1`.`created` <= `app`.`created`
GROUP BY `app`.`created`, `app`.`id`, `app`.`id`
UNION ALL
SELECT `app`.`id`,
'' AS `mxDate`,
`app`.`created`,
MIN(`act1`.`created`) AS `mnDate`
FROM `approvals` AS `app`
JOIN `activities` AS `act1` ON `act1`.`approvalId` = `app`.`id`
WHERE `act1`.`created` >= `app`.`created`
GROUP BY `app`.`created`, `app`.`id`, `app`.`id`
) AS `der`
JOIN `activities` AS `oact1` ON `oact1`.`approvalId` = `der`.`id`
JOIN `activities` AS `oact2` ON `oact2`.`approvalId` = `der`.`id`
GROUP BY `der`.`id`, `oact1`.`id`, `oact2`.`id`, `der`.`created`
HAVING `prevActivityCreated` = MAX(`der`.`mxDate`) AND `postActivityCreated` = MAX(`der`.`mnDate`)
这是我的查询的输出(同样,这个查询有效,这是我需要的输出):
| aprvId | appCreatedDate | preActivityId | prevActivityCreated | postActivityId | postActivityCreated |
| ------ | ------------------- | ------------- | ------------------- | -------------- | ------------------- |
| 1 | 2020-10-04 10:30:05 | 2 | 2020-10-01 12:21:05 | 3 | 2020-10-06 12:21:05 |
| 2 | 2020-10-04 10:42:21 | 6 | 2020-10-04 09:21:05 | 7 | 2020-10-04 15:27:35 |
| 3 | 2020-10-05 11:24:47 | 10 | 2020-10-04 12:21:05 | 11 | 2020-10-06 12:21:05 |
| 4 | 2020-10-06 15:35:35 | 14 | 2020-10-04 14:21:05 | 15 | 2020-10-10 12:21:05 |
它为我提供了我正在寻找的数据,我的问题是:有没有更好、更清洁或更有效的方法来获取这些信息?
【问题讨论】:
标签: mysql sql query-performance