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

yizd12fk  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(496)

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

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\u log\u task)或对项目阶段的引用(通过task\u log\u stage)——它们通过外键引用相应的表。
我正在做一个每月的工作时间使用报告,应该有工作时间分组的结果。工作时间可以花在任务上(然后它有填充的task\u log\u task(references task.task\u id)和可选的task\u log\u stage(references stages.stage\u id,可以为空)或项目上(然后它有task\u log\u project(references projects.project\u id)和可选的stage filled)。
我写了一个查询,可以得到所有这些因素。

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不支持我想要实现的东西?

zysjyyx4

zysjyyx41#

我试着把 task_project 一组一组,似乎奏效了。
所以查询保持不变。

7vhp5slm

7vhp5slm2#

我认为您的分组是错误的,因为您将数据按不同的字段分组:task\u log\u task、task\u log\u project和task\u log\u stage。我想你应该把你用来 task_project 组中的字段,而不是 task_log_stage 字段。。。
分组依据if( task_log_task 不为空(选择 task_projecttasks 哪里 task_id = task_log_task ),如果( task_log_project 不为空, task_log_project ,(选择 stage_project_idstages 哪里 stage_id = task_log_stage ) ) )
再见,卢卡

相关问题