我有一个复合索引(在'name'VARCHAR(50)和'ts'TIMESTAMP列上)。
对于特定记录,我希望按时间找到前面的记录,并使用相同的“名称”(如果存在)。
(当使用低级非关系数据库,例如D-ISAM时,这很快且很简单。)
我如何在MySQL中执行此操作?
答案 0 :(得分:1)
这是一种方法。查找与您要查找的记录具有相同name
的所有行。然后按ts
按相反的顺序排序并选择第一个:
select t.*
from table t join
(select * from table t where <record = your record>
) therec
on t.name = therec.name and t.ts < therec.ts
order by t.ts desc
limit 1;
答案 1 :(得分:0)
我能找到的所有帮助都与@ GordonLinoff的答案一致。
最后,我通过在每条记录中添加一个'seq'uence数字来解决问题,显示它与索引的距离。
这只是数据仅附加的解决方案,但这是我的用例。
我添加了以下值:
SET @num := 0;
UPDATE my_table
SET seq = @num := @num + 1
WHERE name = "my name"
ORDER BY ts, id
这很有效,但很难看。它大致以O(n)运行,而子查询方法是O(N ^ 2),对于超过几千行的任何东西都是不切实际的。