SQL - 使用JOINED表选择

时间:2013-10-29 18:00:05

标签: sql

我正在尝试从用户表中进行选择。对于每个用户,我想为tblregtime中针对给定日期参数的当前用户的所有帖子加上Timediff。

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

中有帖子,它只会给lnameTotalDifftblregtime

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

1 个答案:

答案 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引擎)不够聪明,无法使用索引。