根据订单MYSQL显示特定输出

时间:2013-02-01 01:28:55

标签: mysql sql greatest-n-per-group

我有下表。

ID Name State Date
1   A1   First 1/10/2013
2   A1   Second 1/11/2013
3   A1   Last   1/12/2013
4   A2   First  1/10/2013
5   A2   Closed 1/11/2013
6   A3   First  1/10/2012
7   A3   Second 1/10/2012

州的优先顺序如下

 1 First
 2 Second
 3 Last
 4 Closed

这意味着我必须只显示名称的最新状态(如果状态未关闭。如果状态关闭,我不必显示该ID)。

所以上表的输出应该是

ID Name State Date
3  A1    Last  1/12/2013
7  A3    Second 1/10/2012

我不知道该怎么办?我会尝试一些我已经知道但现在我正在努力的事情。我可以在php中执行此操作并将输出存储在另一个table/view中并显示它,但必须在数据库中完成。

由于

2 个答案:

答案 0 :(得分:1)

假设您的ID是自动增量的。

SELECT  a.*
FROM    tableName a
        INNER JOIN
        (
            SELECT  name, MAX(ID) max_ID
            FROM    tableName
            GROUP   BY Name
        ) b ON  a.ID = b.max_ID AND
                a.Name = b.Name
WHERE   a.State <> 'Closed'

<击>

<击>

或列日期的数据类型为DATE

SELECT  a.*
FROM    tableName a
        INNER JOIN
        (
            SELECT  name, MAX(date) max_date
            FROM    tableName
            GROUP   BY Name
        ) b ON  a.ID = b.max_date AND
                a.Name = b.Name
WHERE   a.State <> 'Closed'

<击>

答案 1 :(得分:0)

我也有这样的解决方案,但我不确定我的是否更快。

SELECT * FROM 
    (SELECT id, name, state, date FROM myTable ORDER BY state DESC, id DESC) AS subQuery
WHERE state <> 'Closed' GROUP BY name

编辑:我试过这种方式,因为GROUP BY只返回第一个项目,而不是最后一个项目,因此首先命令它先放入你要查找的项目,然后对它们进行分组,你知道了!