如果表格没有自动增量列/键,如何按行ID 排序SELECT
个结果?
此外,如果我不能使用LIMIT
子句,如果不存在自动增量行,我怎么能使用ORDER BY
获取最后100个呢?
答案 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 mysql或Need 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;