mysql - 使用 sum() 子查询连接三个表

标签 mysql database join relational-database

当从两个表中提取数据(中间有第三个表)时,我无法进行查询。让我告诉你我的意思。

*Table companies*
id int PK
name text 

*Table projects*
id int PK
company_id int FK
project_name text

*Table hours_worked*
id int pk
user_id int FK
project_id int FK
hours float
date_worked datetime

*Table users*
id int PK
user_name text

基本上,我需要的是一个根据用户 ID 提取每个公司工作总小时数的查询。

请注意,每个项目的 table_hours 工作时间每天可以有多个提交。例如,几行可能看起来像

id  project_id user_id  hours  date_worked
 1       1        1       2     20-08-2012
 2       1        1       1.5   20-08-2012
 3       2        1       3     21-08-2012
 4       2        2       12    22-08-2012

我想要的结果是返回如下内容的查询:

company_name     total_hours
 Bobs Kitchens       25
 Mikes Bikes         67

这将返回每个公司(而非项目)的总工作小时数,例如用户 ID 为 1 的用户。

这是我尝试过的以下查询,但没有成功:

        SELECT DISTINCT companies.name as company_name,
        companies.id as company_id,
        (
          SELECT SUM(hours_worked.hours) FROM hours_worked
          WHERE projects.id = hours_worked.project_id
          AND projects.company_id = company_id
        ) as total_hours
        FROM hoursworked, companies, projects
        WHERE projects.company_id = company_id
        AND projects.company_id = projects.company_id
        AND hours_worked.user_id = 1
        GROUP BY companies.id

这给了我一个奇怪的结果,每个total_hours字段似乎都显示一个非常奇怪的数字。对于任何公司来说,75 小时都不是正确的总工作时间!

company_name   total_hours
Mikes Kitchen      75
Charlies Bikes     75
 .....             75

任何帮助将不胜感激!

最佳答案

试试这个:

SELECT c.name company_name, u.user_name, SUM(h.hours) total_hours
FROM projects p 
INNER JOIN companies c ON p.company_id = c.id 
INNER JOIN hours_worked h ON p.id = h.project_id 
INNER JOIN users u ON h.user_id = u.id
GROUP BY c.id, u.id

关于mysql - 使用 sum() 子查询连接三个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13491838/

相关文章:

mysql - 将 SQL 数据从服务器 A 发送到服务器 B 的选项

database - 在以不同点头的容器形式运行的数据库镜像的不同实例中,如何实现数据同步?

database - 设计一个存储过程,用于在 win7 上的 Aginity Workbench 4.3 中运行 Netezza 数据库中的某些功能

根据单独表中的观察结果连接两个表(在 EG 中)?

mysql - 如何在MySQL中简单地水平连接多个表?

mysql - 挂起的 SQL 查询

php - 具有多对多关系的 Symfony 3 uniqueEntity 验证

mysql - 使用 SQL 的循环缓冲区

mysql - 最佳实践列结构

Mysql根据连接表分割列值