我有一个表格,其中包含了在以下任务上花费的时间:
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不支持我想要实现的东西?
2条答案
按热度按时间yhuiod9q1#
我试着把
task_project
一组一组,似乎奏效了。所以查询保持不变。
vpfxa7rd2#
我认为您的分组是错误的,因为您将数据按不同的字段分组: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_project
从tasks
哪里task_id
=task_log_task
),如果(task_log_project
不为空,task_log_project
,(选择stage_project_id
从stages
哪里stage_id
=task_log_stage
) ) )再见,卢卡