我有一个存储日志信息的表(主要是状态更改)
表格是这样的:
+----+--------+----------+---------------------+
| 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
开头,之后更改为sent
或not sent
或者可以从sent
或not sent
开始,在这种情况下,状态不会再改变
我认为,根据这些条件,我可以sent
或not sent
分组,没有问题(这是正确的吗?)
但是,如何仅为buffered
行生成报告?
在这个特定的样本中,如果我被问到:缓冲的数字是正确的答案:number 27
Pd积。
我认为标题并不能准确反映这个问题,如果有人有更好的标题,请随时改变它。
答案 0 :(得分: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);
答案 1 :(得分: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)
请确保数字和时间戳字段包含为保证查询效果而创建的相应索引。
答案 2 :(得分: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
<强>解释强>
用数字键加入你的桌子。第二次,表只采用值不同于'buffered'的行。如果在“第二个”表中找到一行,则表示它们的值不同于使用此数字的“缓冲”值。
答案 3 :(得分:0)
按照出现的顺序对所有状态进行分组,并仅选择那些以缓冲状态开始和结束的状态(仅具有状态:缓冲)
Select number, group_concat(status) allstatus
from tablename
group by number
having allstatus regexp '^buffered$'
order by timestamp