Составляю простенький органайзер, получилась вот такая задачка:
Есть ежедневные дела, последовательность которых фиксирована (по возрастанию ID), однако время начала выполнения указано не для каждого дела.
Есть события, привязанные к конкретному времени (то есть время обязательно указывается).
Задача:
Вывести список каждодневных дел в правильном порядке, плюс, соблюдая временную последовательность, внутри этого списка вставить события.
Допустим, на 16 назначена уборка, далее на 18 назначена прогулка. На 17 часов имеется событие - встреча с другом. Надо, чтобы это событие вставилось именно между уборкой и прогулкой.
Проблема - у событий не указана отметка последовательности (точнее, ID совершенно другие, т. к. другая таблица), а у каждодневных дел не везде указано время начала, так что ни по тому, ни по тому столбцу сортировать нельзя.
Что делать? Как впихнуть события внутрь списка каждодневных дел?
CREATE TABLE IF NOT EXISTS `tasks`.`daily` (
`id` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`description` TEXT NULL DEFAULT NULL,
`time` TIME NULL DEFAULT NULL,
`length` TIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `name_UNIQUE` (`name` ASC))
ENGINE = InnoDB
CREATE TABLE IF NOT EXISTS `tasks`.`events` (
`id` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`description` TEXT NULL DEFAULT NULL,
`date` DATETIME NOT NULL,
`length` TIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `name_UNIQUE` (`name` ASC),
UNIQUE INDEX `date_UNIQUE` (`date` ASC))
ENGINE = InnoDB
Запрос для вывода дел на сегодня (сюда надо добавить сортировку):
(SELECT id, name,
TIME_FORMAT(time, '%H:%i') as time,
TIME_FORMAT(length, '%H:%i') as length
FROM daily)
UNION
(SELECT id, name,
DATE_FORMAT(date, '%H:%i') as time,
TIME_FORMAT(length, '%H:%i') as length
FROM events
WHERE DATE_FORMAT(date, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d'))