2013-04-08 70 views
0

好了,我有一個這樣的表:選擇MySQL的記錄與最新的時間戳

ID Number  State  Gender   tstamp 
==----======----=======----======----=================== 
1  01  Open  Male  2013-04-06 10:27:26 
2  01  Open  Female 2013-04-07 10:28:23 
3  04  Open  Male  2013-04-07 11:23:13 
4  04  Closed  Male  2013-04-07 11:26:45 
5  01  Open  Male  2013-04-07 12:23:21 
5  04  Open  Female 2013-04-08 13:27:55 
6  04  Open  Male  2013-04-08 13:28:53 
7  01  Open  Female 2013-04-09 13:29:23 
8  01  Open  Female 2013-04-09 13:30:36 

,我需要生成一些SQL/PHP與國家公開賽每個數字來算男的記錄。然後我需要檢查記錄性別是否已經改變過,並忽略之前設置的狀態。因此,如上述,當記錄號01從馬累再次變爲女性,回男性,然後再次回到女我需要它忽略舊的性別,只是算男性記錄,以便將只能算:

6  04  Open  Male  2013-04-08 13:27:65 
8  01  Open  Female 2013-04-09 13:27:65 

,然後返回2作爲計數。

我無法理解我將如何做到這一點,我嘗試了一個while循環,檢查狀態是否相同,性別與最後記錄相同,但我無法做到我想要的。我敢肯定,如果有人向我展示解決方案,那麼它會突然變得有意義。

我真的很感謝這個幫助!

謝謝!

回答

1

如果我很好地理解問題,您需要類似這樣的東西。

SELECT COUNT(*) FROM your_table_name t1 WHERE state='Open' GROUP BY ID ORDER BY tstamp DESC 

或u需要先使兩個相同的表之間的連接這個連接你需要只選擇1號(DESC排序由TSTAMP)的值,並計算這些值。

1

首先,您需要獲取每個號碼的最後一條記錄。這需要一個連接:

select t.* 
from t join 
    (select t.number, max(id) as maxid 
     from t 
     group by t.number 
    ) tmax 
    on t.id = tmax.maxid 

然後,而不是選擇所有記錄,去做自己想做的計數:

select t.number, sum(case when gender = 'male' and state = 'open' then 1 else 0 end) as NumMales 
from t join 
    (select t.number, max(id) as maxid 
     from t 
     group by t.number 
    ) tmax 
    on t.id = tmax.maxid 
group by t.number 

你也可能會問到0/1標誌每個數說是否存在男性/開放記錄。爲此,您可以這樣做:

select t.number, max(case when gender = 'male' and state = 'open' then 1 else 0 end) 
from t 
group by t.number