【问题标题】:Get SELECT results ordered by "row id" in mySQL在 mySQL 中获取按“行 id”排序的 SELECT 结果
【发布时间】:2013-09-20 22:27:59
【问题描述】:

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

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

【问题讨论】:

  • 该表是否有ID 列?如果是这样 - 您是否在每次插入时手动更新它?如果是 - 使用它,如果不是 - 你怎么能order by 不存在的东西?我感觉你的问题对我来说不是很清楚......
  • 您能否提供当前的表结构,和/或指出如何计算row-id?
  • 表格中没有ID列。

标签: mysql


【解决方案1】:

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

SET @rownum:=0;

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果不查看您想询问的表架构和示例查询,很难回答您的问题。特别是,如果没有指定排序顺序,很难想象“最后 500 个”是什么意思。既然无论如何都不能保证是一致的,那么为什么要关心“最后一个”100 而不是“第一个”100?

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

      2) 如果您想保持 当前 自然顺序,我建议在表中添加一个自动递增的“id”列,使用如上所述的递增变量更新行,以及设置AUTOINCREMENT。这样您以后就可以一直按此列排序。

      3) 最后,作为一个噱头,我尝试在不使用递增变量的情况下获得“最后 100 个”,但如果没有存储过程,这实际上是不可能的。这些类型的查询都不起作用:

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

      【讨论】:

        【解决方案4】:

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

        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;
        

        【讨论】:

          【解决方案5】:

          select * from <table_name> order by _rowId;

          【讨论】:

            猜你喜欢
            • 2018-08-08
            • 2011-02-12
            • 2011-01-27
            • 1970-01-01
            • 2014-07-03
            • 2017-03-30
            • 1970-01-01
            • 2020-05-26
            • 1970-01-01
            相关资源
            最近更新 更多