【发布时间】:2011-02-14 20:52:54
【问题描述】:
通常我会在自动递增时有一个名为 ID 的表字段。这样我就可以使用这个字段等进行订购。
但是我无法控制表格的结构,并且想知道如何以与默认相反的顺序获得结果。
我正在使用
$q = mysql_query("SELECT * FROM ServerChat LIMIT 15");
但是就像我说的没有我可以订购的字段,那么有没有办法告诉 mysql 反转它得到结果的顺序?即最后一行到第一行而不是默认值。
【问题讨论】:
通常我会在自动递增时有一个名为 ID 的表字段。这样我就可以使用这个字段等进行订购。
但是我无法控制表格的结构,并且想知道如何以与默认相反的顺序获得结果。
我正在使用
$q = mysql_query("SELECT * FROM ServerChat LIMIT 15");
但是就像我说的没有我可以订购的字段,那么有没有办法告诉 mysql 反转它得到结果的顺序?即最后一行到第一行而不是默认值。
【问题讨论】:
MySQL 支持按序列位置排序:
SELECT * FROM ServerChat ORDER BY 1 DESC LIMIT 15
但是 IIRC 的这种 ORDER BY 用法在 SQL 标准中已被弃用。如果某些 RDBMS 供应商(最终)停止支持它,请不要感到惊讶。
一般来说,最好知道你的表结构。
【讨论】:
没有。没有要订购的字段就没有办法
【讨论】:
实际上,您正在以所谓的“表格顺序”获得结果,这可能看起来像是数据添加到表格中的顺序,但该顺序并不稳定。有许多操作可以更改您接收结果的顺序,而无需更改表本身的数据。
要重现您看到的那种顺序,我建议在您的表中添加一个ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP 类型的列。这将为您提供一个专门排序的列,因此可以反转该顺序。如果此操作很频繁,您可能还应该在该列上添加一个索引。
【讨论】:
根据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 尝试过,但是这个方法对我来说确实很有意义。
【讨论】:
您的表必须指定一些唯一索引。它不必命名为 ID,但它通常是必需的,并且可能决定当前返回的订单。它是什么?不管是什么,我的理解是你应该能够像这个例子一样使用唯一标识符hash 做一个ORDER BY ... DESC(或者如果这不起作用,ASC):
$q = mysql_query("SELECT * FROM ServerChat ORDER BY `hash` DESC LIMIT 15");
【讨论】: