2013-08-23 28 views
0

以下SQL查詢將返回處於開發或完成模式的所有程序。這裏的目標是獲得所有程序的最新狀態。如何返回具有多個狀態的表中的最後一條記錄

我用下面的查詢返回我的所有的程序規定

SELECT PK_ProgramState, FK_Program, State 
FROM ProgramStates 

我得到如下結果:

Program states

在本圖像的彩色矩形看作是由黃色亮點,我想要返回那些「FK_Program」記錄。不需要在最後突出顯示的記錄狀態之前出現的其他人。

我似乎無法弄清楚如何做到這一點...所有我一直想給我假的結果的查詢。所有的幫助表示讚賞。

在此先感謝。

回答

4
SELECT s1.PK_ProgramStatee, s1.FK_Program, s1.State 
FROM ProgramStates s1 
inner join 
(
    SELECT max(PK_ProgramState) as mstate, FK_Program 
    FROM ProgramStates 
    group by FK_Program 
) s2 on s2.mstate = s1.PK_ProgramState and s2.FK_Program = s1.FK_Program 
+0

我得到的錯誤:'列 'ProgramStates.FK_Program' 在選擇列表中無效,因爲它不是在任何一個包含聚合函數或GROUP BY子句。# – Alex

+0

@Alex:我更新了查詢。有一點小錯誤。 –

+0

太棒了,工作! – Alex

1

這裏有一種方法:

select fk_program 
from ProgramStates ps 
group by fk_program 
having substring_index(group_concat(State order by PK_ProgramState desc), ',', 1 
        ) in ('Development', 'Completed'); 

這是找到使用group_concat()比則比較要尋找狀態的最後狀態。

你也可以寫having子句:

having group_concat(State order by PK_ProgramState desc) like 'Completed%' or 
     group_concat(State order by PK_ProgramState desc) like 'Development%' 

的意圖可能會以這種形式更加清晰。

+0

我收到錯誤'關鍵字'order'附近的語法不正確.'在第一個「group_concat」行 – Alex

+0

@Alex。 。 。 'order by'肯定是'group_concat()'語法的一部分(參見http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html)。你能編輯你的問題並添加你正在使用的查詢嗎? –

1

試試這個:

SELECT DISTINCT FK_Program, 
    (SELECT TOP(1) State FROM ProgramStates P1 
    WHERE P1.FK_Program = ProgramStates.FK_Program 
    ORDER BY PK_ProgramState DESC) as State 
FROM ProgramStates 
+0

我收到'LIMIT'附近語法不正確。' – Alex

+0

@Alex你使用的是MSSQL還是MySQL? –

+0

如果您正在使用MSSQL取消該限制1並改變選擇狀態選擇最前(1)國家 –

1
select p.fk, (select ps.state from ProgramStates ps 
       where ps.FK_Program = p.fk 
       order by ps.PK_ProgramState desc limit 1) 

from (select distinct q.FK_Program as fk 
from ProgramStates q) as p 

http://sqlfiddle.com/#!2/422d92/19

+0

這也工作! – Alex

1
select 
    ps.PK_ProgramState, 
    ps.FK_Program, 
    ps.state 
from 
    ProgramStates ps 
inner join 

    (select max(PK_ProgramState)PK_ProgramState, FK_Program from ProgramStates group by FK_Program) stg 
    on stg.FK_Program=ps.FK_Program and stg.PK_ProgramState=ps.PK_ProgramState 
相關問題