2013-10-29 58 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' –