我正在尝试从用户表中进行选择。对于每个用户,我想为tblregtime
中针对给定日期参数的当前用户的所有帖子加上Timediff。
问题是即使在给定日期没有为当前用户完成注册,我也需要获取信息。如果没有注册我需要输出当前用户TotalDiff=0
。我当前的SQL不能以这种方式工作。如果fname
lname
,TotalDiff
和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 :(得分: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引擎)不够聪明,无法使用索引。