选择最后一行没有任何类型的键

时间:2011-01-07 23:00:06

标签: mysql

我需要获取表中的最后一行(使用MySQL的自然顺序 - 即我没有任何ORDER BY子句得到的行),但是没有任何键可以在ORDER BY上进行!

表中唯一的“键”是索引的MD5字段,因此我无法对其进行ORDER BY。没有时间戳,自动增量值或任何其他我可以轻松订购的字段。这就是为什么我只留下自然排序作为我的“最新”指标。

并且,不幸的是,更改表结构以添加适当的auto_increment是不可能的。 :(

任何人对于如何使用普通SQL,或者我是SOL吗?

都有任何想法

5 个答案:

答案 0 :(得分:3)

如果是MyISAM,你可以在两个查询中完成

SELECT COUNT(*) FROM yourTable;  
SELECT * FROM yourTable LIMIT useTheCountHere - 1,1;

这是不可靠的,因为

  1. 假设行仅添加到此表中,并且从不删除。
  2. 假设在此期间没有对此表执行其他写操作(您可以锁定表)
  3. MyISAM表可以使用ALTER TABLE重新排序,因此不再保留插入顺序。
  4. 在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;