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;
答
不要使用隐式连接语法,这是一种反模式
改为使用显式连接:
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
-1,有效语法是,但结果是不一样的,因为'act_hours'不应由'那里completed_date来实现IS NULL' – Johan
犯规相当的工作。您的查询使用est_hours和act_hours上的completed_date参数为null。但是,如果act_hours被标记为已完成并且日期已输入completed_date,则它只会包含大于零的值。 – JimmyJammed
@JamesHickman现在(检查我的更新)? – Icarus