【问题标题】:Order mysql results without identifier订购没有标识符的mysql结果
【发布时间】:2011-02-14 20:52:54
【问题描述】:

通常我会在自动递增时有一个名为 ID 的表字段。这样我就可以使用这个字段等进行订购。

但是我无法控制表格的结构,并且想知道如何以与默认相反的顺序获得结果。

我正在使用

$q = mysql_query("SELECT * FROM ServerChat LIMIT 15");

但是就像我说的没有我可以订购的字段,那么有没有办法告诉 mysql 反转它得到结果的顺序?即最后一行到第一行而不是默认值。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    MySQL 支持按序列位置排序:

    SELECT * FROM ServerChat ORDER BY 1 DESC LIMIT 15
    

    但是 IIRC 的这种 ORDER BY 用法在 SQL 标准中已被弃用。如果某些 RDBMS 供应商(最终)停止支持它,请不要感到惊讶。

    一般来说,最好知道你的表结构。

    【讨论】:

      【解决方案2】:

      没有。没有要订购的字段就没有办法

      【讨论】:

        【解决方案3】:

        实际上,您正在以所谓的“表格顺序”获得结果,这可能看起来像是数据添加到表格中的顺序,但该顺序并不稳定。有许多操作可以更改您接收结果的顺序,而无需更改表本身的数据。

        要重现您看到的那种顺序,我建议在您的表中添加一个ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP 类型的列。这将为您提供一个专门排序的列,因此可以反转该顺序。如果此操作很频繁,您可能还应该在该列上添加一个索引。

        【讨论】:

        • 我无法控制表格的结构
        【解决方案4】:

        根据this article,SQL-92 允许用户从名为 INFORMATION_SCHEMA 的“众所周知的”视图或表中查询表结构信息。 MySQL 5.0 及更高版本支持 SQL-92。

        示例/摘录:

        SELECT table_name, column_name, is_nullable, data_type, character_maximum_length
        FROM INFORMATION_SCHEMA.Columns
        WHERE table_name = 'employees'
        

        因此,您可以使用列名列表来允许用户选择对其排序的列,然后使用this SO answer 确定如何构建动态 SQL,以便正确执行查询。

        我没有用 MySQL 尝试过,但是这个方法对我来说确实很有意义。

        【讨论】:

          【解决方案5】:

          您的表必须指定一些唯一索引。它不必命名为 ID,但它通常是必需的,并且可能决定当前返回的订单。它是什么?不管是什么,我的理解是你应该能够像这个例子一样使用唯一标识符hash 做一个ORDER BY ... DESC(或者如果这不起作用,ASC):

          $q = mysql_query("SELECT * FROM ServerChat ORDER BY `hash` DESC LIMIT 15");
          

          【讨论】:

          • 我无法控制表格的结构
          • 每个表都有结构。你不必控制它,只要知道它的样子。
          • 没有一个列是唯一标识符,也没有一个可以用来排序的列将它们按任何正确的顺序排列,因此我问。
          猜你喜欢
          • 1970-01-01
          • 2013-02-04
          • 2017-05-29
          • 2013-03-06
          • 1970-01-01
          • 1970-01-01
          • 2015-05-30
          • 2016-06-13
          • 1970-01-01
          相关资源
          最近更新 更多