选择具有最新时间戳的mysql记录

时间:2013-04-08 11:25:56

标签: php 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来计算每个数字的状态为Open的Male记录。然后我需要检查记录性别是否已经改变,并忽略先前设置的状态。所以如上所述,当记录号01从男性变为女性,再次回到男性,然后再一次回到女性,我需要它忽略旧性别,只计算男性记录,因此它只计算:

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

然后将返回2作为计数。

我无法理解我将如何做到这一点,我尝试了一个循环,检查状态是否相同,性别与最后的记录相同,但我无法做到这一点我想了。我敢肯定,如果有人向我展示解决方案,那么这一切都会突然变得有意义。

我会非常感谢你的帮助!

谢谢!

2 个答案:

答案 0 :(得分:1)

如果我理解问题,你需要这样的事情。

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

或者您需要首先在此连接中的两个相同表之间进行连接,您只需要选择1个ID值(按tstamp排序DESC)并计算这些值。

答案 1 :(得分: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