1

如果表没有自动增量列/键,我如何获得SELECT行 ID排序的结果?

LIMIT此外,例如,如果我不能使用ORDER BY子句,因为不存在自动增量行,我如何使用它们来获取最后 100 个?

4

5 回答 5

1

您可以尝试以下方法,尽管我不保证它会像您想要的那样工作:

SET @rownum:=0;

SELECT *
FROM (SELECT @rownum:=@rownum+1 as rownum,
             *
      FROM yourTable) t1
ORDER BY rownum DESC
LIMIT 100;

我不得不提一下,如果你的表中没有唯一的 ID,那么排序将永远是一个棘手的问题。你永远无法分辨事物的显示顺序。(换句话说:它不可靠!)

于 2013-09-16T17:18:46.297 回答
1

在关系数据库中,没有排序顺序或第一行或最后一行。如果你想有一个特定的顺序,你必须在一个ORDER BY子句中指定一个列。您可能SELECT whatever FROM yourTable连续 500 次简单地得到相同的结果,但是当重建索引或添加越来越多的行时,这种行为可能会迅速改变。

于 2013-09-16T17:19:47.753 回答
1

select * from <table_name> order by _rowId;

于 2014-08-28T02:34:44.647 回答
0

如果不查看您要询问的表架构和示例查询,就很难回答您的问题。特别是,如果没有指定排序顺序,很难想象“最后 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;
于 2013-09-16T17:56:13.107 回答
0

这个(见下文)有效,但它有点慢......

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;
于 2013-09-16T19:18:01.780 回答