2013-02-01 24 views
1

我有一個下表。根據訂單顯示特定的輸出MYSQL

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中並顯示它,但必須在數據庫中完成。

感謝

回答

1

假設你ID被auto_incremented。

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' 

+0

OMG是我的列ID是自動遞增的.. DUH !!我本來可以使用.. ..非常感謝..但兩個國家可以在同一天.. – Ank

+0

所以你更喜歡哪個查詢?第一個還是第二個? –

+0

第一個..但你可以保留第二個..(可能對未來某個人有用) – Ank

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只能返回你的第一個項目,而不是最後一個,所以先責令其置於首位你看看,然後將它們分組的一個,你得到它!