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

时间:2011-05-06 14:21:54

标签: php mysql

这是我的表结构

MyTable
ID[P.K][auto increment]   TopicID   UID   Comment

现在我想获得TopicID的最后20条评论,但它应该按升序排序!

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

我正在寻找一个优化版本,我可以使用2/3查询和php排序数组,但寻找更好的替代

Sample Result with data

MyTable  
ID TopicID UID Comment  
1  1       10  AAAA   
2  1       11  BBBB  
3  1       10  CCCC  
4  1       10  dddd   
5  1       11  EEEE  
6  1       10  FFFF

我想获得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  

8 个答案:

答案 0 :(得分:38)

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

select * from (
    select * from your_table order by id desc limit 20
) tmp order by tmp.id asc

答案 1 :(得分:3)

SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        WHERE   topicid = $mytopicid
        ORDER BY
                id DESC
        LIMIT 20
        ) q
ORDER BY
        id

或更有效率

(
SELECT  *
FROM    mytable
WHERE   topicid = $mytopicid
ORDER BY
        id DESC
LIMIT 20
)
ORDER BY
        id

答案 2 :(得分:2)

这应该是完成这项工作的最短表达方式:

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

答案 3 :(得分:1)

 SELECT * FROM
   (SELECT * FROM MyTable
   ORDER BY ID DESC
   LIMIT 20) ilv
 ORDER BY ID;

答案 4 :(得分:0)

我真的不明白??

简单的SELECT * FROM MyTable WHERE TopicID = 1 ORDER BY ID ASC LIMIT 20有什么问题?

顺便说一句,如果你显示最新输入的(即最近的),你需要DESC(降序),而不是ASC。此外,使用ID非常不可靠,您应该有一个DATETIME列,用于存储评论输入的时间。

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

答案 5 :(得分:0)

您需要添加CommentDate列,每次您使用NOW()GETDATE()插入评论时,请使用此选择:

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

答案 6 :(得分:-1)

假设ID为auto_increment,允许您将其用作伪日期字段,

SELECT * FROM MyTable
  ORDER BY ID DESC
  LIMIT 20

答案 7 :(得分:-1)

你可以试试这个

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