2013-07-05 52 views
0

我有一個包含一組任務的一個表來執行:在一個表中選擇的行,添加的列,其中在其它相關表中的行的MAX(日期)

Task 

    ID Name 

    1 Washing Up 
    2 Hoovering 
    3 Dusting 

用戶可以添加一個或多個注到註釋表。每個音符與任務相關聯:

Note 

    ID ID_Task  Completed(%) Date 

    11 1  25  05/07/2013 14:00 
    12 1  50  05/07/2013 14:30 
    13 1  75  05/07/2013 15:00 
    14 3  20  05/07/2013 16:00 
    15 3  60  05/07/2013 17:30 

我想要一個查詢,將選擇任務ID,名稱和它的%完成,這應該是零,如果有沒有它的任何說明。查詢應返回:

ID Name  Completed (%) 

    1 Washing Up 75 
    2 Hoovering 0 
    3 Dusting  60 

,我真的一直在努力與查詢對於這一點,我已經閱讀是一種問題「每組最大的N」,其中有關於SO,沒有很多的例子其中我可以適用於我的案件(或至少完全理解)。我的直覺是由音符表找到MAX(日)爲每個任務開始:

SELECT ID_Task, 
      MAX(Date) AS Date 
      FROM 
      Note 
      GROUP BY 
      ID_Task 

煩人,我不能只是添加「完成%」以上的查詢,除非它包含在GROUP子句。哎呀!我不知道如何跳過這個箍環,以便以某種方式獲得任務錶行,其中添加了列。這是我可悲的嘗試,因爲它只返回任務和筆記,然後複製任務記錄(每個筆記一個,所以這是一個完全失敗),因此失敗。

SELECT Task.ID, 
    Task.Name, 
    Note.Complete 
    FROM 
    Task   
    JOIN 
    (SELECT ID_Task, 
     MAX(Date) AS Date 
     FROM 
     Note 
     GROUP BY 
     ID_Task) AS InnerNote 
    ON 
    Task.ID = InnerNote.ID_Task 
    JOIN 
    Note 
    ON 
    Task.ID = Note.ID_Task 

任何人都可以幫助我嗎?那麼你想要一個與最後日期

select t.ID, t.Name, coalesce(max(n.complete), 0) 
from tasks t left outer join 
    notes n 
    on t.id = n.id_task 
group by t.id, t.name 

如果任務可以成爲「不完整」:

回答

2

如果我們假定任務只會變得更加完整,你可以用left outer join和聚集做到這一點。對於這一點,你可以使用row_number()

select t.ID, t.Name, coalesce(n.complete, 0) 
from tasks t left outer join 
    (select n.*, row_number() over (partition by id_task order by date desc) as seqnum 
     from notes n 
    ) n 
    on t.id = n.id_task and n.seqnum = 1; 

在這種情況下,你不需要group by,因爲seqnum = 1執行相同的作用。

+1

是的,任務會變得 「不完整」,如這個應用程序是用於項目管理:)。 – Robinson

+0

這實際上很狡猾。利用row_number。 – Robinson

+0

確定這個工程。謝謝。這太妙了。今天學到了一個新的竅門。 – Robinson

0

這個怎麼樣剛拿到的完成了最大和GROUP BY的taskid

SELECT t.ID_Task as ID,n.`name`,MAX(t.completed) AS completed 
FROM `task` t RIGHT JOIN `note` n on ( t.ID_Task=n.ID) 
GROUP BY t. ID_Task 

OR

SELECT t.ID_Task as ID,n.`name`, 
(CASE when MAX(t.completed) IS NULL THEN '0' ELSE MAX(t.completed))AS completed 
FROM `task` t RIGHT JOIN `note` n on ( t.ID_Task=n.ID) 
GROUP BY t. ID_Task 
0
select a.ID, 
     a.Name, 
     isnull((select completed 
       from Note 
       where ID_Task = b.ID_Task 
        and Date = b.date),0) 
from Task a 
LEFT OUTER JOIN (select ID_Task, 
         max(date) date 
        from Note 
       group by ID_Task) b 
ON a.ID = b.ID_Task; 

See DEMO here

相關問題