2013-08-23 26 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 
相关问题