通常我会在自动增量上有一个名为ID的表字段。这样我可以使用此字段等订购。
但是我无法控制表的结构,并想知道如何以相反的顺序将结果设置为默认值。
我正在使用
$q = mysql_query("SELECT * FROM ServerChat LIMIT 15");
但是就像我说的那样我没有可以订购的字段,那么有没有办法告诉mysql反转它获得结果的顺序?即最后一行到第一行而不是默认行。
答案 0 :(得分:5)
MySQL支持按顺序列位置排序:
SELECT * FROM ServerChat ORDER BY 1 DESC LIMIT 15
但是IIRC在SQL标准中不推荐使用ORDER BY
。如果一些RDBMS供应商(最终)停止支持它,请不要感到惊讶。
一般来说,最好知道你的表格结构。
答案 1 :(得分:0)
没有。没有要订购的领域,就没有办法
答案 2 :(得分:0)
您实际上是在所谓的“表格顺序”中获得结果,这可能看起来像是将数据添加到表中的顺序,但该顺序不稳定。有许多操作可以在不更改表本身数据的情况下更改接收结果的顺序。
要重现您看到的那种订单,我建议您在类型ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
的表格中添加一列。这将为您提供专门订购的列,从而反转该订单。如果此操作经常发生,您应该在该列上添加索引。
答案 3 :(得分:0)
根据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,但这种方法对我来说当然有意义。
答案 4 :(得分:0)
您的表必须指定一些唯一索引。它不必是ID,但它通常是必需的,并且很可能决定了当前返回的订单。它是什么?无论是什么,我的理解是你应该能够使用唯一标识符ORDER BY ... DESC
执行ASC
(或者,如果这不起作用,hash
),例如<{1}}:
$q = mysql_query("SELECT * FROM ServerChat ORDER BY `hash` DESC LIMIT 15");