2011-10-05 70 views
3

我試圖讓兩個不同的列來自同一個表的款項,按用戶進行分組的總和。問題是,我必須找到一筆款項,需要一些額外的參數。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)僅獲得該用戶的總和。

我一直兜兜我的腦袋疼,所以任何幫助表示讚賞!

回答

2

這是在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; 
+1

-1,有效語法是,但結果是不一樣的,因爲'act_hours'不應由'那裏completed_date來實現IS NULL' – Johan

+0

犯規相當的工作。您的查詢使用est_hours和act_hours上的completed_date參數爲null。但是,如果act_hours被標記爲已完成並且日期已輸入completed_date,則它只會包含大於零的值。 – JimmyJammed

+1

@JamesHickman現在(檢查我的更新)? – Icarus

3

不要使用隱式連接語法,這是一種反模式

改爲使用顯式連接:

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