我需要获取表中的最后一行(使用MySQL的自然顺序 - 即我没有任何ORDER BY子句得到的行),但是没有任何键可以在ORDER BY上进行!
表中唯一的“键”是索引的MD5字段,因此我无法对其进行ORDER BY。没有时间戳,自动增量值或任何其他我可以轻松订购的字段。这就是为什么我只留下自然排序作为我的“最新”指标。
并且,不幸的是,更改表结构以添加适当的auto_increment是不可能的。 :(
任何人对于如何使用普通SQL,或者我是SOL吗?
都有任何想法答案 0 :(得分:3)
如果是MyISAM,你可以在两个查询中完成
SELECT COUNT(*) FROM yourTable;
SELECT * FROM yourTable LIMIT useTheCountHere - 1,1;
这是不可靠的,因为
在InnoDB中它完全不可靠,因为这个引擎可以随意重新排序表。
答案 1 :(得分:1)
基本上,你不能这样做。
通常情况下,我建议使用自动增量和ORDER BY添加代理主键:
SELECT *
FROM yourtable
ORDER BY id DESC
LIMIT 1
但是在你的问题中,你写的是......
更改表结构以添加正确的auto_increment是不可能的。
所以我能想到的另一个不太令人愉快的选择是使用模拟的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
请注意,这会产生严重的性能影响:它需要完整扫描,并且不保证在子查询中以任何特定顺序返回结果 - 您可能按排序顺序获取结果,但然后你可能不会 - 当你没有'指定顺序时,服务器可以自由选择它喜欢的任何顺序。现在它可能将选择它们存储在磁盘上的顺序,以尽可能少地工作,但依赖于此是不明智的。
答案 2 :(得分:1)
我可以问你为什么需要这样做吗?
在oracle中,MySQL也可能是相同的,但优化器会选择最快的记录/顺序来返回结果。因此,如果您的数据是静态的,则可能会运行相同的查询两次并获得不同的答案。
答案 3 :(得分:0)
如果没有order by
条款,您无法保证获得结果的顺序。 SQL引擎可以自由选择任何订单。
但是如果由于某种原因你还是想依赖这个命令,那么下面的命令确实会从结果中返回最后一条记录(仅限MySql):
select *
from (select *,
@rn := @rn + 1 rn
from mytable,
(select @rn := 0) init
) numbered
where rn = @rn
在子查询中,不使用order by
检索记录,并给出序号。外部查询然后仅选择获得最后一个属性数的那个。
答案 4 :(得分:0)
我们可以使用针对那种问题 -
SELECT MAX(id) as last_id,column1,column2 FROM table HAVING id=last_id;