Это моя таблица структуры
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