2013-10-29 57 views
0

我试图从用户tabel做选择。对于每个用户,我希望为给定日期参数的当前用户对tblregtime中的所有帖子的Timediff进行求和。SQL - 选择加入表

问题是,即使在当前用户的给定日期没有完成注册,我也需要获取信息。如果没有注册,我需要输出当前用户有TotalDiff=0。我目前的SQL不能以这种方式工作。这将只是给fnamelnameTotalDiff如果在后tblregtime


SQL:

select u.fname,u.lname, sum(cast(TIME_TO_SEC(TIMEDIFF(r.edate,r.sdate)) AS UNSIGNED)-r.break_time) as TotalDiff 

from tbluser u 

RIGHT OUTER JOIN tblregtime r on r.userid=u.id where r.projectid=21 
and year(r.sdate)=2013 and month(r.sdate)=10 and day(r.sdate)=7 
+0

首先请确保您的所有字段都有表名或别名。谁可以告诉他们属于哪张桌子。如果不清楚字段来自哪里,你永远不应该写任何sql。 – HLGEM

+0

thx,我只是更新了sql代码。 –

+0

你有样品数据? –

回答

1

如果你试图把一切都在tbluser,那么你想有一个left join代替一个right join。但是,您还需要将where条件移至on条款。否则,当出现不匹配,则比较会失败(因为r.值将是NULL):

select u.fname,u.lname, 
     sum(cast(TIME_TO_SEC(TIMEDIFF(r.edate,r.sdate)) AS UNSIGNED)-r.break_time) as TotalDiff 
from tbluser u LEFT JOIN 
    tblregtime r 
    on r.userid = u.id and 
     r.projectid = 21 and 
     year(r.sdate) = 2013 and month(r.sdate) = 10 and day(r.sdate) = 7; 

我也建议你改变最后的日期比较喜欢的东西:

r.sdate = '2013-10-07' 

该表格允许使用r.sdate上的索引。正如你写的那样,SQL引擎(至少是我熟悉的SQL引擎)不足以使用索引。

+0

这解决了我在将where条件移到on子句时的问题。我的最终代码:'select u.fname,u.lname, sum(cast(TIME_TO_SEC(TIMEDIFF(r.edate,r.sdate))AS UNSIGNED)-r.break_time)从tbluser的TotalDiff u LEFT JOIN tblregtime ř 上(r.userid = u.id和 r.projectid = 21和 日期(SDATE)= '2013年10月1日' ) INNER JOIN tblgroup_users GU ON gU.userID = u.id INNER JOIN tblgroup_project的gB上gB.tblGroupID = gU.tblGroupID 其中gB.tblprojectID = 21 AND(gU.status = 0 OR gU.status = 2) 组由r.userid 为了通过u.fname AS C,u.lname ASC' –