我有一个表格通过自动增量列(跟踪记录输入的顺序)和“CURRENT_FLAG”(最后插入的记录设置为1)进行版本控制。加入此表的视图始终使用CURRENT_FLAG = 1,以便它们仅返回最后一条记录。
所以如果结构是这样的:
AUTO_ID PERSON_ID PERSON_VALUE CURRENT_FLAG
1 1 5452 0
2 1 637 1
3 2 4523 1
下次我要插入记录时,我需要更新CURRENT_FLAG。现在我执行这样的事情:
UPDATE T
LEFT JOIN (
SELECT PERSON_ID, MAX(AUTO_ID) as AUTO_ID
FROM T
GROUP BY PERSON_ID
) as T1 ON T.PERSON_ID = T1.PERSON_ID and T.AUTO_ID = T1.AUTO_ID
SET T.CURRENT_FLAG = COALESCE(T.PERSON_ID / T.PERSON_ID, 0)
即使在PERSON_ID和AUTO_ID上都有索引,该查询在一个相当小的表上也需要几秒钟。
记录从临时表中作为批处理插入,并且一次不插入一个人,因此我无法拉出auto_ids并手动设置标记或将所有current_flags设置为0.
有没有人有更好的方法来编写该查询,或者使用触发器和\或其他解决方案做同样的事情? MySQL 5.0 +。
答案 0 :(得分:0)
有多种方法可以获取最近添加的记录,而不是拥有额外的CURRENT_FLAG
列。您可以尝试下订单并获取第一条记录:
SELECT [field1, field2, etc...] FROM `T`
WHERE [...]
ORDER BY AUTO_ID DESC
LIMIT 0, 1
答案 1 :(得分:0)
我和Marc B.不要将CURRENT_FLAG保留在表格中,并且打败你的服务器以使其保持最新状态,只需抓住每个人的最新记录,如下所示:
SELECT T.*
FROM T
WHERE AUTO_ID IN
(
SELECT MAX(AUTO_ID) AS AUTO_ID
FROM T
GROUP BY PERSON_ID
)
您可以将其定义为视图。如果对它应用WHERE子句,比如
WHERE T.PERSON_ID = :somebody
只要在PERSON_ID和AUTO_ID上有索引,优化器就会做正确的事。