MySQL IF子句中的嵌套查询似乎无法按预期工作

时间:2018-12-05 17:15:43

标签: mysql nested-queries

我有一个表,其中包含花在执行以下任务上的时间:

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(引用stages.stage_id,可以为null)上,或者在项目上花费(然后它具有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 :(得分:0)

我认为您的GROUP BY错误,因为您有按不同字段分组的数据:task_log_task,task_log_project和task_log_stage。 我认为您应该将用于task_project字段的公式放在GROUP BY中,而不要放在task_log_stage字段中 ...

组别 如果(  task_log_task不为空,    (在task_project = tasks的{​​{1}}中选择task_id),     IF(task_log_task不为空,task_log_project,      (在task_log_project = {{1}的stage_project_id中选择stages))

ciao 路卡

答案 1 :(得分:0)

我试图将task_project放到GROUP BY,它似乎可以正常工作。

因此查询保持不变。