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

MySQL内部IF子句中的嵌套查询似乎无法按预期工作,mysql,nested-queries,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 DEFAUL

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

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(引用project.project_id)和可选的stage填充)

我写了一个查询,可以得到所有这些因素

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\u id=task\u log\u task
,而不是将当前
task\u log\u task
放入查询中


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

我认为您的分组是错误的,因为您的数据按不同的字段分组:任务日志任务、任务日志项目和任务日志阶段。 我认为您应该将用于
task\u project
字段的公式放在GROUP BY中,而不是
task\u log\u stage
字段中

分组 如果(
task\u log\u task
不为空, (从
tasks
中选择
task\u project
,其中
task\u id
=
task\u log\u task
), 如果(
任务日志项目
不为空,
任务日志项目
, (从
stages
中选择
stage\u project\u id
,其中
stage\u id
=
task\u log\u stage
))

再见
卢卡

我试着把
task\u项目
分组,结果似乎奏效了


因此,查询保持不变。

看起来你是对的。我正在重新阅读查询,无法理解它以前是如何工作的。如果MySQL支持if in GROUP BY Sentence,这很有趣。我测试了查询,没有导致错误。但是我没有数据,所以我不知道是否返回了正确的结果。