mySQL - 将id传递给嵌套查询

时间:2011-10-05 20:43:51

标签: mysql nested sum

我试图从同一个表中获取两个不同列的总和,按用户分组。问题是,我必须找到的一个总和,需要一些额外的参数。

表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 

我只希望来自已标记为已完成的条目的est_hours(通过在completed_date列中包含值。如果completed_date为空,则act_hours将为空白)

我的查询问题是我没有得到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;

我知道我需要以某种方式将OUID查询中的userid传递到内部查询中,以便SUM(est_hours)只获取该用户的总和。

我一直在圈子里,我的大脑很疼,所以任何帮助都会受到赞赏!!

2 个答案:

答案 0 :(得分:3)

不要使用隐式连接语法,它是反模式

改为使用显式联接:

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;

您头痛的解决方案是使用表别名,然后您可以引用同一个表的不同实例 我强烈建议始终使用表别名重新定义所有字段,因此不会混淆字段来自哪个(实例)表。
这也会缩短您的行,使您的查询更具可读性。

答案 1 :(得分:2)

这在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;