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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5912770/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 22:51:58  来源:igfitidea点击:

Select last 20 order by ascending - PHP/MySQL

phpmysql

提问by Sourav

This is my table structure

这是我的表结构

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

Now i want to get the last 20 comment for a TopicID but it should be sorted in ascending order !

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

[Just like Facebook by default shows last 20 comment only]

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

I am looking for an optimized version, i can do this with 2/3 query and php sort array, but looking for some better alternative

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

Sample Result with data

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

I want to get the last 3 result for a TopicID, the result should be

我想获取 TopicID 的最后 3 个结果,结果应该是

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

and not

并不是

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

回答by binaryLV

First, select last 20 entries. Then sort them in ascending order. You can easily do this in a single query (with subquery):

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

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

回答by Jpsy

This should be the shortest expression to do the job:

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

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

回答by Quassnoi

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

or, more efficiently,

或者,更有效地,

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

回答by symcbean

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

回答by Danpe

You need to add a CommentDate Column and everytime you INSERT a comment use NOW()or GETDATE()then use this select:

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

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

回答by Rudi Visser

I don't really understand??

我真的不明白??

What's wrong with a simple SELECT * FROM MyTable WHERE TopicID = 1 ORDER BY ID ASC LIMIT 20?

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

By the way, if you're showing the latest entered ones (ie. most recent), you'll want DESC(Descending), not ASC. Also, using the ID is very unreliable, you should have a DATETIMEcolumn which stores when the comment was entered.

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

EDIT: binaryLV's answerwill do this correctly using a subquery. It's the same query as mine, DESC'd, and then resorted by ID.

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

回答by eykanal

Assuming that ID is auto_increment, which would allow you to use it as a pseudo-date field,

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

SELECT * FROM MyTable
  ORDER BY ID DESC
  LIMIT 20

回答by Naushad Ali

You can try this

你可以试试这个

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