按升序选择最后20个订单-PHP/MySQL

按升序选择最后20个订单-PHP/MySQL,php,mysql,Php,Mysql,这是我的桌子结构 MyTable ID[P.K][auto increment] TopicID UID Comment 现在我想得到一个TopicID的最后20条评论,但它应该按升序排序 [就像Facebook默认只显示最后20条评论] 我正在寻找一个优化的版本,我可以用2/3查询和php排序数组来实现这一点,但寻找一些更好的替代方案 带数据的样本结果 我想得到TopicID的最后3个结果,结果应该是 4 1 10 dddd 5 1 11 E

这是我的桌子结构

MyTable
ID[P.K][auto increment]   TopicID   UID   Comment
现在我想得到一个TopicID的最后20条评论,但它应该按升序排序

[就像Facebook默认只显示最后20条评论]

我正在寻找一个优化的版本,我可以用2/3查询和php排序数组来实现这一点,但寻找一些更好的替代方案

带数据的样本结果

我想得到TopicID的最后3个结果,结果应该是

4  1       10  dddd   
5  1       11  EEEE  
6  1       10  FFFF
而不是

6  1       10  FFFF  
5  1       11  EEEE  
4  1       10  dddd  

我真的不明白

从MyTable中选择一个简单的SELECT*,其中TopicID=1 ORDER BY ID ASC LIMIT 20有什么问题

顺便说一句,如果您显示的是最新输入的,即最近输入的,您将需要DESC降序,而不是ASC。另外,使用ID是非常不可靠的,您应该有一个DATETIME列来存储输入注释的时间


编辑:将使用子查询正确执行此操作。它与我的查询相同,DESC'd,然后按ID重新调用。

假设ID是自动递增的,这将允许您将其用作伪日期字段

SELECT * FROM MyTable
  ORDER BY ID DESC
  LIMIT 20

您需要添加CommentDate列,每次插入注释时使用NOW或GETDATE,然后使用以下选择:

SELECT Comment FROM MyTable WHERE TopicID=@ID ORDER BY CommentDate DESC, TopicID ASC LIMIT 20

首先,选择最后20个条目。然后按升序对它们进行排序。您可以使用子查询在单个查询中轻松完成此操作:

select * from (
    select * from your_table order by id desc limit 20
) tmp order by tmp.id asc
或者更有效地说

(
SELECT  *
FROM    mytable
WHERE   topicid = $mytopicid
ORDER BY
        id DESC
LIMIT 20
)
ORDER BY
        id
你可以试试这个

SELECT * FROM(
    SELECT TOP 20 * FROM TableName
    ORDER BY Id DESC
)
Naushad ORDER BY Naushad.Id

这应该是执行作业的最短表达式:

    (select * from your_table order by id desc limit 20) order by id; 

你想按哪个字段排序?我想按ID ascendingHe需要最后20个条目,按asc排序。比如5,6,7,而不是1,2,3,4,5,6,7中的7,6,5。是的,但他不需要第一个条目。@binaryLV你是什么意思,看看我的查询now@Danpe,我的意思是他需要选择CommentDate最大的最后一个条目。顺便说一下,如果他使用timestamp列存储日期,他可以将其默认值设置为current_timestamp。不需要手动填写now或getdate。我喜欢按id排序的想法,这是我通常做的。不过,此查询的结果不会按作者的需要进行排序。此处不需要使用子查询。子查询非常昂贵,而且几乎没有必要。通过只运行子查询,然后在PHP端以相反的顺序打印它们,可以获得相同的结果。当在可选字段列表中使用select id、name、subquery作为表中的内容或在where子句中使用select id、name from where foo=subquery时,它们确实很昂贵,但可以将它们用作数据源。@eykanel-胡说八道。将数据映射到PHP中并在数据库外对其进行排序既浪费又高效。这也是对程序员时间的浪费。这可以做得容易得多:从表中选择*按id描述顺序限制20按id asc顺序;和往常一样,您可以省略asc。@谢谢:-问题被标记为MySQL,您的脚本适用于SQL Server。
 SELECT * FROM
   (SELECT * FROM MyTable
   ORDER BY ID DESC
   LIMIT 20) ilv
 ORDER BY ID;
SELECT * FROM(
    SELECT TOP 20 * FROM TableName
    ORDER BY Id DESC
)
Naushad ORDER BY Naushad.Id
    (select * from your_table order by id desc limit 20) order by id;