1

我有一个存储日志信息的表(主要是状态变化)

表是这样的:

+----+--------+----------+---------------------+
| id | number |  status  |      timestamp      |
+----+--------+----------+---------------------+
|  1 |     25 | buffered | 2012-05-05 23:10:10 |
|  2 |     25 | sent     | 2012-05-05 23:10:11 |
|  3 |     26 | not sent | 2012-05-05 23:10:12 |
|  4 |     27 | buffered | 2012-05-05 23:10:13 |
+----+--------+----------+---------------------+

我需要按状态生成报告。但是号码的状态可以改变。

号码的状态可以从 开始,buffered然后更改为sentnot sent

sentor 可以以or开头,not sent在这种情况下,状态不会再改变

我认为在这些条件下,我可以按问题sentnot sent没有问题进行分组(这是正确的吗?)

但是我怎样才能只为buffered行生成报告呢?

在这个特定的示例中,如果有人问我:缓冲了哪些数字,正确答案是:number 27

PD

我认为标题并不能准确反映问题,如果有人有更好的标题,请随时更改。

4

4 回答 4

0

假设您的表名是“log_table”,这应该为您提供给定数字的最新状态:

 SELECT number, status FROM log_table  AS l WHERE timestamp = (SELECT MAX(timestamp) 
              FROM log_table WHERE number = l.number);

我对 MYSQL 的最大愿望之一是它允许(但目前不支持):

SELECT number, status FROM log_table GROUP BY number HAVING MAX(timestamp);
于 2012-10-04T20:15:15.567 回答
0
SELECT number, status FROM YOUR_TABLE t1 WHERE status  = :someStatus and NOT EXISTS (SELECT id FROM YOUR_TABLE t2 WHERE t1.id<>t2.id and t1.number = t2.number and t2.timestamp>t1.timestamp) 

请确保数字和时间戳字段包含为保证查询性能而创建的适当索引。

于 2012-10-04T20:36:55.720 回答
0

这里是查询(没有子查询以获得更好的性能):

select distinct
    l1.id,  l1.number, l1.status, l1.timestamp 
from 
    my_logs l1 
 left outer joing
    my_logs l2
        on l1.number = l2.number and l2.status <> 'buffered'
where 
    l1.status = 'buffered' and
    l2.number is null

解释:

通过数字键加入您的表。第二次,表只取值不同于“缓冲”的行。如果在“第二个”表中找到一行,则表示它们的值与此数字的“缓冲”不同。

于 2012-10-04T21:01:36.903 回答
0

按出现的顺序对所有状态进行分组,并仅选择以状态缓冲开始和结束的状态(只有状态:缓冲)

Select number, group_concat(status) allstatus 
from tablename
 group by number
 having allstatus regexp '^buffered$'
 order by timestamp
于 2012-10-04T21:19:22.250 回答