订购没有标识符的mysql结果

时间:2010-05-02 23:03:13

标签: php mysql

通常我会在自动增量上有一个名为ID的表字段。这样我可以使用此字段等订购。

但是我无法控制表的结构,并想知道如何以相反的顺序将结果设置为默认值。

我正在使用

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

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

5 个答案:

答案 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");