MySQL查询,下次在另一列中捕获

MySQL query to capture the next time in another column

提问人:mcmurphy 提问时间:10/21/2023 更新时间:10/21/2023 访问量:31

问:

我有两个这样的表:

CREATE TABLE `event_tag` (
    `event_tag_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `start` DATETIME NULL DEFAULT NULL,
    `end` DATETIME NULL DEFAULT NULL,
    `tag` VARCHAR(12) NULL DEFAULT NULL,
    `event_id` INT(10) NOT NULL,
    PRIMARY KEY (`event_tag_id`) USING BTREE,
    INDEX `fk_event_id` (`event_id`) USING BTREE,
    CONSTRAINT `fk_event_id` FOREIGN KEY (`event_id`) REFERENCES `event` (`event_id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
ENGINE=InnoDB
;

CREATE TABLE `event` (
    `event_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `start` DATETIME NOT NULL,
    `end` DATETIME NOT NULL,
    `event_name` VARCHAR(20) NOT NULL DEFAULT '',
    PRIMARY KEY (`event_id`) USING BTREE
)
ENGINE=InnoDB
;

events 表定义具有 start DateTime 和 end DateTime 的事件。

每个事件可以应用零个或多个标签,但在任何给定时间只能应用一个标签。每个标记都可以应用于部分或全部事件,并有自己的开始、结束、结束。缺少条目或标记为 NULL 的条目表示该事件(或时间范围)没有标记。

事件表中的条目应“堆叠”。也就是说,在相同的时间范围内,较新的条目应覆盖较早的条目。

因此,给定一个事件:

event_id    start               end                 event_name
1234        2023-10-20 12:00:00 2023-10-20 20:00:00 bob

和一个标签:

event_tag_id start              end                  tag   event_id
1            NULL               NULL                 foo   1234

此查询:

SELECT
    et.event_tag_id,
    IFNULL(et.start, e.start) AS start,
    IFNULL(et.end, e.end) AS end_date,
    et.tag,
    et.event_id
FROM
    event_tag et
    LEFT JOIN event e 
        ON et.event_id = e.event_id
WHERE
    et.event_id = 1234
;

给我我需要的东西:

event_tag_id start               end                 tag    event_id
1            2023-10-20 12:00:00 2023-10-20 20:00:00 foo    1234

但是,当我添加另一个标签时,从事件开始两个小时,一直持续到结束:

event_tag_id start               end                  tag   event_id
2            2023-10-20 14:00:00 NULL                 bar   1234

上面的查询,给了我以下内容:

event_tag_id start               end                 tag    event_id
1            2023-10-20 12:00:00 2023-10-20 20:00:00 foo    1234
2            2023-10-20 14:00:00 2023-10-20 20:00:00 bar    1234

但我需要的是:

event_tag_id start               end                 tag    event_id
1            2023-10-20 12:00:00 2023-10-20 14:00:00 foo    1234
2            2023-10-20 14:00:00 2023-10-20 20:00:00 bar    1234

其中,较早条目的结束时间是下一个条目的开始时间。

问题因此,从本质上讲,我需要的是一个(子)查询,以便它将返回:

a. DateTime(如果已设置)。

b.b. 如果为 NULL,则为该event_id的下一个最早标记的开始,其开始发生在其自己的开始时间之后。(例如,标记 Foo 的开始时间是 12:00 - 继承自事件 - 该事件的下一个最早开始时间是 14:00)。

c.c. 如果为 Null,并且同一事件没有其他稍后开始时间,则为事件的结束时间。

这在MySQL中是否可行,如果可行,如何制定查询?

mysql datetime 子查询

评论

0赞 Ian Newson 10/21/2023
That is to say that more recent entries should override earlier entries for the same time frames“相同的时间范围”是指完全相同的开始和结束时间,还是任何重叠?
0赞 FriendlyDragon 10/21/2023
像这样的东西?dbfiddle.uk/9tA3HYmy
0赞 mcmurphy 10/21/2023
@IanNewson......任何重叠。
0赞 mcmurphy 10/21/2023
@FriendlyDragon......是的,这行得通。谢谢。

答: 暂无答案