Ответ 1
Сначала выберите последние 20 записей. Затем отсортируйте их по возрастанию. Вы можете легко сделать это в одном запросе (с подзапросом):
select * from (
select * from your_table order by id desc limit 20
) tmp order by tmp.id asc
Это моя структура таблицы
MyTable
ID[P.K][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 [email protected] 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