【发布时间】:2010-10-11 09:02:45
【问题描述】:
我遇到了一个相当奇怪的问题。我有以下示例数据可以在 mysql 数据库中使用:
|钥匙|数据|索引 |总计|时间戳 | | # |一个 | 1 | 2 | 2009-01-02 01:01:32 | | $ |乙 | 2 | 2 | 2009-01-02 01:03:32 | | % | c | 1 | 3 | 2009-01-03 01:01:32 | | ^ | d | 2 | 3 | 2009-01-03 01:04:32 | | & |电子| 3 | 3 | 2009-01-03 01:02:32 | | * | f | 1 | 2 | 2009-01-05 01:01:32 |发生的事情是另一个进程(不在我的控制之下)正在接收数据包,并将它们直接存储到数据库中,并带有到达时间的时间戳。数据包应该以突发形式到达...... a,b 将彼此靠近并被索引为 1 和 2,每个数据包包含传输的数据包的“总数”。 key 是一个普通的自增主键。
我需要的是一个显示最近到达的列表的视图(部分列表,如果不是所有的数据包都到达,是可以接受的)。
对于上述查询,理想情况下,结果应该只是“f”,但我没有看到这样做的方法。如果我们不能以其他方式得到它,返回“a”和“f”是可以接受的。换句话说,select 语句捕获的少量额外数据并不是什么大问题。在“f”到来之前的一段时间,正确的返回是c、d和e。
我的总体想法是这样的:
SELECT * FROM 表 WHERE 总计 = ( SELECT total FROM table WHERE timestamp = ( 从表中选择 MAX(时间戳) ) ) ORDER BY DESC 时间戳 限制 ( SELECT total FROM table WHERE timestamp = ( 从表中选择 MAX(时间戳) )正如你们中的一些人可能已经注意到的,您不能在 LIMIT 子句中执行子查询(至少对于 mysql)。有没有人有另一种方法来解决这个问题?通过将 JOIN 嵌套到最近 id 的小列表中,可以使上面的查询更加简洁,但这仍然会在子查询中留下 LIMIT 子查询问题。
作为一个两阶段查询,这是相对微不足道的。问题是它需要成为 VIEW 的定义选择语句。
编辑以修复错误的 sql 示例
【问题讨论】:
-
你能试着清楚地解释什么是“最近的”吗?既然你说“F”和“A”是可以接受的,它看起来不像是直接的时间戳。
-
我假设一种方法可以保证唯一的“索引”值,确保返回的行数不超过“总数”行。基本上说虽然返回“f”很关键,但返回“a”也不会是致命缺陷。
-
很遗憾,每个集合都没有标识符,如果您的集合跨越 2 天,或者两个集合重叠,您将遇到麻烦。
-
由于索引是按顺序分配的,您可以使用我在下面做的答案。
-
...或者我在下面做的那个,任何一个都应该工作。