Как отсортировать задачи?

Составляю простенький органайзер, получилась вот такая задачка:

Есть ежедневные дела, последовательность которых фиксирована (по возрастанию 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'))
  • Вопрос задан
  • 167 просмотров
Пригласить эксперта
Ответы на вопрос 1
SQL писать не буду, проверять долго, предложу просто идею: нужно получить вычисляемую дату+время, с помощью которой можно выстроить на одной временной шкале по порядку как ежедневые дела, так и события. По сути, ежедневные дела это ежедневные события - т.е. события, у которых дата = сегодняшяя_дата+время_ежедневного_дела. Для дел, у которых время начала не указано, ставить дефолтовое (например, полдень). Итого:
1) оставляем union
2) добавляем в подзапрос from daily вычисляемое значение, которое собирается из текущей даты и значения поля time, задаем ему имя, напр. occurence_time;
3) дату+время ивента в подзапросе from events также вытаскиваем as occurence_time;
4) теперь вроде ничего не мешает отсортировать по полю occurence_time слитые в одно множество события.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы