我需要获取表中最后(最新)的一行数据(使用MySQL的自然顺序-即没有任何ORDER BY子句时所得到的顺序),但是我无法使用任何可以用于ORDER BY的键!
该表中唯一的“键”是一个索引的MD5字段,因此我无法真正地按照它进行排序。也没有时间戳、自增值或任何其他容易排序的字段。这就是为什么我只能使用自然排序作为我的“最新”的指示器。
不幸的是,改变表结构以添加适当的自动递增是不可能的。 :(
有人有任何想法如何使用纯SQL完成这个任务,或者我只能认命了吗?
我需要获取表中最后(最新)的一行数据(使用MySQL的自然顺序-即没有任何ORDER BY子句时所得到的顺序),但是我无法使用任何可以用于ORDER BY的键!
该表中唯一的“键”是一个索引的MD5字段,因此我无法真正地按照它进行排序。也没有时间戳、自增值或任何其他容易排序的字段。这就是为什么我只能使用自然排序作为我的“最新”的指示器。
不幸的是,改变表结构以添加适当的自动递增是不可能的。 :(
有人有任何想法如何使用纯SQL完成这个任务,或者我只能认命了吗?
SELECT COUNT(*) FROM yourTable;
SELECT * FROM yourTable LIMIT useTheCountHere - 1,1;
然而,这种方法并不可靠,因为
在 InnoDB 中根本不可靠,因为该引擎可以随意重新排序表。
您可以使用ROW_NUMBER
函数来分配行号,然后使用ORDER BY
子句按此值排序。
SELECT *,
ROW_NUMBER() OVER() AS rn
FROM table
ORDER BY rn DESC
LIMIT 1;
我可以问一下你为什么需要这样做吗?
在Oracle中,可能对于MySQL也是如此,但优化器会选择最快的记录/顺序来返回结果。因此,如果您的数据是静态的,则有可能运行相同的查询两次并获得不同的答案。
order by
子句,您无法保证获得结果的顺序。 SQL引擎可以自由选择任何顺序。select *
from (select *,
@rn := @rn + 1 rn
from mytable,
(select @rn := 0) init
) numbered
where rn = @rn
order by
检索的,并且被赋予了一个顺序号。然后外部查询仅选择获得最后属性编号的那个记录。基本上,你不能这样做。
通常我建议添加一个自动增量的替代主键,并按照它进行排序:
SELECT *
FROM yourtable
ORDER BY id DESC
LIMIT 1
但是在你的问题中,你写道...
更改表结构以添加适当的自动增量是不可能的。
因此,我能想到的另一个不太愉快的选择是使用变量来模拟ROW_NUMBER:
SELECT * FROM
(
SELECT T1.*, @rownum := @rownum + 1 AS rn
FROM yourtable T1, (SELECT @rownum := 0) T2
) T3
ORDER BY rn DESC
LIMIT 1
我们可以使用having来解决这种问题-
SELECT MAX(id) as last_id,column1,column2 FROM table HAVING id=last_id;