Вложенный запрос в MySQL внутри предложения IF, похоже, не работает должным образом - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть таблица, которая содержит время, затраченное на задачи, описанные следующим образом:

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 не поддерживает то, чего я хочу достичь?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Я пытался поместить task_project в GROUP BY, и, похоже, он работает.

Таким образом, запрос остается прежним.

0 голосов
/ 05 декабря 2018

Я думаю, что вы неправильно указали GROUP BY, потому что у вас есть данные, сгруппированные по разным полям: task_log_task, task_log_project и task_log_stage.Я думаю, что вы должны поместить формулу, которую вы использовали для поля task_project в GROUP BY вместо поля task_log_stage ...

GROUP BY IF (task_log_task NOT NULL, (SELECT task_project ОТ tasks ГДЕ task_id = task_log_task), ЕСЛИ (task_log_project НЕ НУЛЬ, task_log_project, (ВЫБРАТЬ stage_project_id ОТ stages ГДЕ stage_id = task_log_stage)))

чао Лука

...