我有一个表,其中包含花在执行以下任务上的时间:
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不支持我想要实现的目标?
答案 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,它似乎可以正常工作。
因此查询保持不变。