Выберите последний 20-й порядок по возрастанию – PHP / MySQL

Это моя таблица структуры

MyTable ID[PK][auto increment] TopicID UID Comment 

Теперь я хочу получить последние 20 комментариев для TopicID, но он должен быть отсортирован в порядке возрастания!

[Так же, как 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 

Я хочу получить последние 3 результата для TopicID, результат должен быть

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

и не

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

Сначала выберите последние 20 записей. Затем отсортируйте их по возрастанию. Вы можете легко сделать это в одном запросе (с подзапросом):

 select * from ( select * from your_table order by id desc limit 20 ) tmp order by tmp.id asc 
 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 
  SELECT * FROM (SELECT * FROM MyTable ORDER BY ID DESC LIMIT 20) ilv ORDER BY ID; 

Я действительно не понимаю?

Что не так с простым SELECT * FROM MyTable WHERE TopicID = 1 ORDER BY ID ASC LIMIT 20 ?

Кстати, если вы показываете последние введенные (т. Е. Самые последние), вам понадобится DESC (Descending), а не ASC . Кроме того, использование идентификатора очень ненадежно, у вас должен быть столбец DATETIME который хранится при вводе комментария.

EDIT: ответ binaryLV будет делать это правильно, используя подзапрос. Это тот же запрос, что и мой, DESC 'd, а затем прибегает к ID.

Вам нужно добавить столбец CommentDate, и каждый раз, когда вы вставляете комментарий, используйте NOW() или GETDATE() затем используйте этот выбор:

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

Это должно быть кратчайшее выражение для выполнения задания:

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

Предполагая, что идентификатор является auto_increment, что позволит вам использовать его в качестве псевдоданного поля,

 SELECT * FROM MyTable ORDER BY ID DESC LIMIT 20 

Вы можете попробовать это

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