我有3个表:活动,目标和要求。我想返回特定要求的所有任务的所有持续时间。这是我的问题:
SELECT r.id as req_id,
r.project_id,
r.name as req_name,
r.cost,r.estimated,
p.name as project_name,
v.name AS `status` ,
t.taskid,
(SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(duration)))
FROM activities a
WHERE a.taskid = t.taskid) AS worked
FROM requirements r
INNER JOIN projects p
ON p.projectid = r.project_id
INNER JOIN `values` v
ON v.id = r.r_status_id
LEFT JOIN tasks t
on t.id_requirement = r.id
WHERE 1 = 1
ORDER BY req_id desc
这就是结果:
正如您所看到的,有两个相同的req_id(48)。我想出现一次,得到worked
中最后两行的总和。我该如何管理?
这是活动结构:
这是任务结构:
这是需求结构:
答案 0 :(得分:1)
将您的活动表包含在您需要的所有需求列的JOIN,GROUP中,并添加总和。由于您正在聚合任务,因此您无法在SELECT子句中使用taskid。
SELECT r.id as req_id,
r.project_id,
r.name as req_name,
r.cost,r.estimated,
p.name as project_name,
v.name AS `status` ,
SEC_TO_TIME(SUM(TIME_TO_SEC(a.duration)))
FROM requirements r
INNER JOIN projects p ON p.projectid = r.project_id
INNER JOIN `values` v ON v.id = r.r_status_id
LEFT JOIN tasks t ON t.id_requirement = r.id
LEFT JOIN activities a ON a.taskid=t.taskid
WHERE 1 = 1
GROUP BY r.id, r.project_id, r.name,r.cost,r.estimated,p.name, v.name
ORDER BY req_id desc
答案 1 :(得分:0)
查询中的联接似乎是在创建额外的行。我确信有一种方法可以直接修复逻辑,可能是通过在from
子句中预先聚合一些结果。
您的副本似乎是完全重复的(每列完全相同)。解决问题的简便方法是使用select distinct
。因此,只需使用以下命令开始查询:
SELECT DISTINCT r.id as req_id, r.project_id, r.name as req_name,
. . .
我怀疑你的一个基础表有重复的行,你不期望,但这是另一个问题。