首页 > 解决方案 > MySQL 中 IF 子句中的嵌套查询似乎无法按预期工作

问题描述

我有一张表,其中包含花费在任务上的时间,如下所述:

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,可能为空)或项目(然后它有 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字面意思,而不是将 currenttask_log_task放入查询中。

或者 MySQL 不支持我想要实现的东西?

标签: mysqlnested-queries

解决方案


我试图把task_projectGROUP BY 和它似乎工作。

所以查询保持不变。


推荐阅读