mysql - 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 不支持我想要实现的东西?
解决方案
我试图把task_project
GROUP BY 和它似乎工作。
所以查询保持不变。
推荐阅读
- sql - 替换 Firebird 中的空格
- swift - 使用 ReusableKit swift 注册 UITableViewCell
- sql - SQL 从两个等于相同搜索结果的字段中选择结果
- python - 在机器人框架中定义一个关键字以仅在失败时调用
- laravel - Laravel 8.x,3 个模型和多对多关系
- angular - 仅当 Rxjs 轮询上的某些属性更改时才调度 NgRx 操作
- bash - 将容器的环境变量用于命令谎言
- windows - 如何使用 grafana 在 Windows 10 上监控 POS 应用程序并在应用程序关闭时发送警报
- pine-script - 带 SMA 功能的偏移量
- yii2 - 如何在记录更新中隐藏 TIME 值?