2010-01-17 54 views
0

我有三個表Mysql場景 - 即使沒有條目,也可以獲取所有任務嗎?

  1. Tasks與同列TaskId, EmpNum, WorkedDate, Hoursspent

現在我想相處某一週的所有任務條目列Taskid, EmpNum

  • TaskEntriesTaskid, Taskname
  • TaskAllocations。在這裏,我的問題是即使沒有Taskentry的特定任務,我應該得到至少一行TaskId,Taskname的Querys結果集中的小時數爲Null。我一直試圖用下面的查詢來獲得這個。

    SELECT A.TaskId, 
         B.TaskName, 
         SUM(C.HoursSpent) as TotalHours , 
         C.WorkedDate, C.Comments 
        FROM TaskAllocations A 
        LEFT OUTER JOIN TaskEntries C 
        ON A.TaskId = C.TaskId 
        AND A.EmpNum = C.EmpNum 
        INNER JOIN Tasks B 
        ON A.TaskId = B.TaskId 
        WHERE A.EmpNum =123456 
        AND C.WorkedDate 
        IN ('2010-01-17','2010-01-18','2010-01-19', 
         '2010-01-20','2010-01-21','2010-01-22','2010-01-23') 
        GROUP BY A.TaskId, C.WorkedDate 
        ORDER BY A.TaskId,C.WorkedDate ASC '; 
    

    什麼我得到這個SQL塊是當且僅當有特定任務ID的條目,那麼只有我得到了一個列。但是我想要的是爲EmpNum提供的每一個任務獲得至少一行。即使我爲每個TaskId和WorkedDate組合獲得一行也沒有問題。請幫我解決一下這個。這樣做的實際意圖是構建一個HTML二維表,其中每個任務條目的日期和任務如下所示。

     
        --------------------------------------------------------- 
        TaskId TaskName Sun Mon Tue Wed Thu Fri Sat 
        --------------------------------------------------------- 
        18  name1  2   3  4:30  3:30 
        19  name2           
        20  name3  4        2:30 
        22  name4  2:30 
        23  name5  
        24  name6  1:30    6     
        --------------------------------------------------------- 
    

    因此,這可以由用戶每年更新一週。首先我想到group_concat,但由於性能,我正在使用普通組查詢。


    注意:對於特定的taskid和WORKDATE,只會有一個小時的入口。 我幾乎建立了前端。即使沒有條目,請幫助我像上面那樣獲取所有任務ID。我是否需要使用子查詢?

  • 回答

    0

    我想出了以下的解決方案,這將給所要求的結果對我的不同的選擇經過嚴格的測試。

    SELECT Final.TaskId, 
         Final.TaskName, 
         Tmp.HoursSpent AS TotalHours, 
         Tmp.WorkedDate 
        FROM (
         SELECT A.TaskId, B.TaskName, A.EmpNum 
         FROM TaskAllocations A 
           INNER JOIN 
           Tasks B 
          ON (A.TaskId = B.TaskId) 
         WHERE a.empnum = "333" 
         )Final 
        LEFT OUTER JOIN (
          SELECT New.TaskId, New.EmpNum, New.WorkedDate, New.HoursSpent 
         FROM TaskEntries New 
         WHERE New.WorkedDate 
         IN 
           ('2010-01-17','2010-01-18','2010-01-19', 
           '2010-01-20','2010-01-21','2010-01-22','2010-01-23') 
         OR New.WorkedDate IS NULL 
         AND New.EmpNum = "333" 
         )Tmp 
        ON Tmp.TaskId = Final.TaskId 
    AND Tmp.EmpNum = Final.EmpNum 
        ORDER BY Final.TaskId, Tmp.WorkedDate ASC ; 
    

    的問題我的第一個查詢是不工作,因爲我是把右表的列的條件,而這樣做左外連接。感謝所有的支持。

    1

    不要使用內部連接,請使用左側或右側連接,具體取決於您想要哪些表的值。

    這樣:

    SELECT * 
    FROM tasks t 
    LEFT JOIN taskentries te 
    ON t.id = te.id 
    

    這是相同的語句:

    SELECT * 
    FROM tasksentries te 
    RIGHT JOIN tasks t 
    ON te.id = t.id 
    

    將讓你的所有任務,即使沒有taskentry

    內連接只會選擇行當兩個表中都有行時,左連接選擇左邊(第一個)表中的所有行,並從另一行匹配(如果沒有這樣的行,則空值將是所有列的值)。右連接將做相反的處理:從右(第二個)表中選擇所有行並從左邊進行匹配。

    a LEFT JOIN b相同b RIGHT JOIN a

    +0

    是的,我做了同樣的..使用左外連接。但我需要在其他桌子上進行內部連接。所以三個表格有一個左側和一個內側聯接 – 2010-01-17 16:03:54

    +0

    爲什麼當你看到它不工作時你需要一個內部聯接?如果你在任務和任務中心上進行內部連接(就像在你的代碼示例中一樣),你將只在有任務和任務條件時纔會獲得行。你需要所有的任務,甚至那些沒有條目的,所以不要使用內部連接。 – knittl 2010-01-17 16:34:04

    +0

    內部連接在第三個表上,即任務只有TaskName。左連接是在TaskAllocations和TaskEntries ..我甚至刪除了EmpNum上的左外連接,只保留左連接只有taskid但沒用。 – 2010-01-18 05:36:55

    相關問題