提问人:mcmurphy 提问时间:10/21/2023 更新时间:10/21/2023 访问量:31
MySQL查询,下次在另一列中捕获
MySQL query to capture the next time in another column
问:
我有两个这样的表:
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中是否可行,如果可行,如何制定查询?
答: 暂无答案
评论
That is to say that more recent entries should override earlier entries for the same time frames
“相同的时间范围”是指完全相同的开始和结束时间,还是任何重叠?