2013-04-08 4 views
0

Ok, так что у меня есть таблица вроде этого:Выбора 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 для каждого номера. Затем мне нужно проверить, не изменился ли пол, и проигнорировал ранее установленное состояние. Так, как указано выше, если номер записи 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 

или и нужно сначала сделать соединение между двумя одинаковыми таблицами этого соединения вам необходимо выбрать только 1 значение ID (отсортированный 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 
Смежные вопросы