MySQL使用带多个连接的SUM

时间:2015-04-24 13:05:56

标签: php mysql sql codeigniter-2

我有一个项目表和一个任务表我想要进行查询,获取所有项目以及按项目ID分组的time_spent列的总和。因此,基本上列出所有项目并获取属于该项目的任务表中所有time_spent列的总和。

根据下面发布的查询,我得到最新添加的time_spent列,而不是所有列的总和..:S

以下是我目前的查询:

SELECT `projects`.`id`, `projects`.`description`, `projects`.`created`,
`users`.`title`, `users`.`firstname`, `users`.`lastname`, `users2`.`title`
as assignee_title, `users2`.`firstname` as assignee_firstname,
`users2`.`lastname` as assignee_lastname,
(select sum(tasks2.time_spent)
from tasks tasks2
where tasks2.id = tasks.id)
as project_duration
FROM (`projects`)
LEFT JOIN `users`
ON `users`.`id` = `projects`.`user_id`
LEFT JOIN `users` as users2
ON `users2`.`id` = `projects`.`assignee_id`
LEFT JOIN `tasks` ON `tasks`.`project_id` = `projects`.`id`
GROUP BY `projects`.`id`
ORDER BY `projects`.`created` DESC

以下是我的项目表: enter image description here

以下是我的任务表: enter image description here

提前致谢!

2 个答案:

答案 0 :(得分:1)

通常此查询会对您有所帮助。

JOIN

在您的问题中,您不会对用户说些什么。你需要用户吗? 你是正确的,也许你的{{1}}无法获取所有数据。

答案 1 :(得分:1)

此查询应该为您完成。

请注意,无论何时按进行分组,都必须包含您从中选择的每个列或按顺序排序。某些MySql安装不会阻止您这样做,但最终导致结果集不正确。

同样,您不应该将查询作为SELECT语句的一部分(称为子查询),因为它将导致与返回的行数相关的等量额外查询。因此,如果您返回1,000行,则会导致1,001个查询而不是1个查询。

SELECT 
    p.id,
    p.description,
    p.created,
    u.title,
    u.firstname,
    u.lastname,
    a.title assignee_title,
    a.firstname assignee_firstname,
    a.lastname assignee_lastname,
    SUM(t.time_spent) project_duration
FROM
    projects p

LEFT JOIN
    users u ON
        u.id = p.user_id
LEFT JOIN
    users a ON
        a.id = u.assignee_id
LEFT JOIN
    tasks t ON
        t.project_id = p.id
GROUP BY 
    p.id,
    p.description,
    p.created,
    u.title,
    u.firstname,
    u.lastname,
    a.title,
    a.firstname,
    a.lastname
ORDER BY
    p.created DESC