MySQL的 - 通过ID来嵌套查询

问题描述:

我试图让两个不同的列来自同一个表的款项,按用户进行分组的总和。问题是,我必须找到一笔款项,需要一些额外的参数。MySQL的 - 通过ID来嵌套查询

表1:

userid, fname, lname 

表2:

assigned_to (is = to userid from other table), 
est_hours (est = Estimate hours), 
act_hours (act = Actual Hours), 
completed_date 

我只希望从条目完成(通过在列completed_date包含一个值,该已标记的est_hours act_hours将空白,如果completed_date为空)

我查询的问题是,我不是为act_hours和est_hours的总和得到正确的价值观。我认为它与嵌套查询不匹配正确的用户ID有关。 查询:

SELECT userid, 
     fname, 
     lname, 
     SUM(act_hours)+(SELECT SUM(est_hours) 
         from Table2 
         WHERE completed_date IS NULL) AS total_hours 
FROM TABLE2, 
TABLE1 
WHERE TABLE1.userid = TABLE2.assigned_to 
GROUP BY userid; 

我知道我需要以某种方式从外部查询通过用户ID,进入内部查询,使SUM(est_hours)仅获得该用户的总和。

我一直兜兜我的脑袋疼,所以任何帮助表示赞赏!

这是在SQL Server中有效,尝试在MYSQL,可能工作:

SELECT userid, 
     fname, 
     lname, 
     (SELECT SUM(est_hours)+SUM(act_hours) 
         from Table2 
         WHERE completed_date IS NULL and TABLE2.assigned_to=TABLE1.userid) AS total_hours 
FROM 
TABLE1 

好了,恢复到我原来的查询......

SELECT userid, 
     fname, 
     lname, 
     SUM(act_hours)+(SELECT SUM(est_hours) 
         from Table2 
         WHERE completed_date IS NULL 
         AND Table2.assigned_to=Table1.userid) 
     AS total_hours 
FROM TABLE2, 
TABLE1 
WHERE TABLE1.userid = TABLE2.assigned_to 
GROUP BY userid; 
+1

-1,有效语法是,但结果是不一样的,因为'act_hours'不应由'那里completed_date来实现IS NULL' – Johan

+0

犯规相当的工作。您的查询使用est_hours和act_hours上的completed_date参数为null。但是,如果act_hours被标记为已完成并且日期已输入completed_date,则它只会包含大于零的值。 – JimmyJammed

+1

@JamesHickman现在(检查我的更新)? – Icarus

不要使用隐式连接语法,这是一种反模式

改为使用显式连接:

SELECT 
    t1.userid, 
    t1.fname, 
    t1.lname, 
    SUM(t2.act_hours)+(SELECT SUM(t3.est_hours) 
        FROM Table2 t3 
        WHERE t3.completed_date IS NULL 
         AND t3.assigned_to = t1.userid) AS total_hours 
FROM table2 t2 
INNER JOIN table1 t1 ON (t1.userid = t2.assigned_to) 
GROUP BY userid; 

解决你的头痛是使用表的别名,那么你可以参考同一个表的不同实例。
我强烈建议,总是refix与表的别名所有领域,所以不能有任何混乱哪个表(例如其中)领域的来源。
这也将缩短您的线条并使您的查询更具可读性。

+0

在第二到最后一行有一个loos')'。'''应该去哪里? – JimmyJammed