在mySQL中获取由“row id”排序的SELECT结果

时间:2013-09-16 17:12:38

标签: mysql

如果表格没有自动增量列/键,如何按行ID 排序SELECT个结果?

此外,如果我不能使用LIMIT子句,如果不存在自动增量行,我怎么能使用ORDER BY获取最后100个呢?

5 个答案:

答案 0 :(得分:1)

你可以尝试以下方法,虽然我没有给出任何保证它会像你想要的那样工作:

SET @rownum:=0;

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

我必须提到,如果您的表中没有唯一的ID,排序将始终是一个痛苦的问题。你永远无法告诉事物的显示顺序。 (换句话说:它不可靠!)

答案 1 :(得分:1)

在关系数据库中,没有排序顺序或第一行或最后一行。如果要拥有特定订单,则必须在ORDER BY子句中指定一列。对于连续500次的简单SELECT whatever FROM yourTable,您可能会获得相同的结果,但是当重建索引或添加越来越多的行时,该行为可能会快速更改。

答案 2 :(得分:1)

select * from <table_name> order by _rowId;

答案 3 :(得分:0)

如果没有看到您想要问的表架构和示例查询,很难回答您的问题。特别是,很难想象&#34;持续500&#34;表示没有指定排序顺序。既然无论如何都不保证一致,为什么你会关心&#34; last&#34; 100而不是&#34;第一&#34; 100?

1)您可以使用递增变量向查询添加行号,例如Marty McVry建议(或select increment counter in mysqlNeed a sequence number for every row in MySQL query等)。

2)如果您想保持当前自然顺序,我建议添加一个自动递增的ID&#39;如表所示,使用如上所述的递增变量更新行,并设置AUTOINCREMENT。然后,您将能够在将来一直按此列排序。

3)最后,作为一个噱头,我试图得到&#34;最后100&#34; 没有使用递增变量,但没有存储过程它是不可能的。这些类型的查询都不起作用:

SELECT * FROM t LIMIT count(*)-100,100;

SELECT @n := count(*) FROM t;
SELECT * FROM t LIMIT @n-100, 100;

答案 4 :(得分: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;