如果表没有自动增量列/键,我如何获得SELECT
按行 ID排序的结果?
LIMIT
此外,例如,如果我不能使用ORDER BY
子句,因为不存在自动增量行,我如何使用它们来获取最后 100 个?
如果表没有自动增量列/键,我如何获得SELECT
按行 ID排序的结果?
LIMIT
此外,例如,如果我不能使用ORDER BY
子句,因为不存在自动增量行,我如何使用它们来获取最后 100 个?
您可以尝试以下方法,尽管我不保证它会像您想要的那样工作:
SET @rownum:=0;
SELECT *
FROM (SELECT @rownum:=@rownum+1 as rownum,
*
FROM yourTable) t1
ORDER BY rownum DESC
LIMIT 100;
我不得不提一下,如果你的表中没有唯一的 ID,那么排序将永远是一个棘手的问题。你永远无法分辨事物的显示顺序。(换句话说:它不可靠!)
在关系数据库中,没有排序顺序或第一行或最后一行。如果你想有一个特定的顺序,你必须在一个ORDER BY
子句中指定一个列。您可能SELECT whatever FROM yourTable
连续 500 次简单地得到相同的结果,但是当重建索引或添加越来越多的行时,这种行为可能会迅速改变。
select * from <table_name> order by _rowId;
如果不查看您要询问的表架构和示例查询,就很难回答您的问题。特别是,如果没有指定排序顺序,很难想象“最后 500 个”是什么意思。既然无论如何都不能保证是一致的,那么为什么要关心“最后一个”100 而不是“第一个”100?
1)您可以使用递增变量将行号添加到查询中,例如 Marty McVry 建议的(或在 mysql 中选择递增计数器或 需要在 MySQL 查询中为每一行提供序列号等)。
2)如果你想保持当前的自然顺序,我建议在表中添加一个自动递增的 'id' 列,使用如上所述的递增变量更新行,然后设置AUTOINCREMENT
. 然后您将能够在将来始终按此列排序。
3)最后,作为一个噱头,我试图在不使用递增变量的情况下获得“最后 100 个”,但如果没有存储过程,这实际上是不可能的。这些类型的查询都不起作用:
SELECT * FROM t LIMIT count(*)-100,100;
SELECT @n := count(*) FROM t;
SELECT * FROM t LIMIT @n-100, 100;
这个(见下文)有效,但它有点慢......
SET @last = 100;
SET @ofst = (SELECT COUNT(*) FROM table) - @last;
SET @stmt = CONCAT('SELECT * FROM table LIMIT ', @ofst, ', ', @last);
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;