У меня есть таблица, которая содержит время, затраченное на задачи, описанные следующим образом:
CREATE TABLE IF NOT EXISTS `task_log` (
`task_log_id` int(11) NOT NULL,
`task_log_task` int(11) DEFAULT NULL,
`task_log_name` varchar(255) DEFAULT NULL,
`task_log_description` text,
`task_log_creator` int(11) NOT NULL DEFAULT '0',
`task_log_hours` float NOT NULL DEFAULT '0',
`task_log_date` datetime DEFAULT NULL,
`task_log_project` int(11) DEFAULT NULL,
`task_log_stage` int(11) DEFAULT NULL )
Идея состоит в том, чтобы сохранить ссылку на задачу (через task_log_task) или на этап проекта (через task_log_stage) - ониссылка на соответствующие таблицы по внешнему ключу.
Я делаю ежемесячный отчет об использовании рабочего времени и должен иметь результаты, сгруппированные по рабочему времени.Рабочее время может быть потрачено на задачу (тогда она заполняет task_log_task (ссылается на task.task_id) и, необязательно, task_log_stage (ссылается на stage.stage_id, может быть нулевой) или на проект (тогда он имеет task_log_project (ссылается на projects.project_id) и, необязательно, этапзаполнено).
Я пишу запрос, который может получить все эти факторы.
SELECT IF(
`task_log_task` IS NOT NULL,
( SELECT `task_project` FROM `tasks` WHERE `task_id`=`task_log_task` ),
IF ( `task_log_project` IS NOT NULL, `task_log_project`,
( SELECT `stage_project_id` FROM `stages` WHERE `stage_id`=`task_log_stage` ) ) ) AS `task_project`,
`task_log_stage`, SUM(`task_log_hours`)*3600 AS `worked_time`
FROM `task_log`
WHERE `task_log_creator`=$UID
AND `task_log_date` BETWEEN $MONTH_START AND $MONTH_END
GROUP BY `task_log_stage`
Но, похоже, он работает не так, как ожидалось, пропуская фактически использованное рабочее время (по совпадениюэто было мое рабочее время, поэтому я быстро обнаружил ошибку).
В псевдокоде это должно выглядеть так:
0. If there is task_log_task, then take task_project from tasks where task_id = current task_log_task
1. Else if there is task_log_project, then take it as task_project
2. Else if there is no task_log_project, then take task_log_stage, get stage_project_id from stages using task_log_stage as identifier, then take it as task_project
3. Get sum of monthly worked time by stage.
4. Filter them using user_id and date range.
5. ???
6. PROFIT!
Кажется, что буквально требуется task_id=task_log_task
, а не вводить текущий task_log_task
в запрос.
Или MySQL не поддерживает то, чего я хочу достичь?