Выбрать последние N строк из MySQL

122

Я хочу выбрать последние 50 строк из базы данных MySQL в столбце с именем id, который является первичным ключом . Цель состоит в том, что строки должны быть отсортированы по идентификатору в порядке ASC , поэтому этот запрос не работает.

SELECT 
    *
FROM
    `table`
ORDER BY id DESC
LIMIT 50;

Также замечательно, что строками можно манипулировать (удалять), и поэтому следующий запрос тоже не работает

SELECT 
    *
FROM
    `table`
WHERE
    id > ((SELECT 
            MAX(id)
        FROM
            chat) - 50)
ORDER BY id ASC;

Вопрос : Как можно получить последние N строк из базы данных MySQL, которыми можно манипулировать, и расположить их в порядке ASC?

nanobash
источник

Ответы:

237

Вы можете сделать это с помощью подзапроса:

SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC

Это выберет последние 50 строк из table, а затем упорядочит их в порядке возрастания.

newfurniturey
источник
5
^ FYI, я знаю, что эта статья посвящена MySQL, но хотел сообщить, что в ответ на комментарий @DiegoDD выше, исключение внешнего выбора и псевдонима, похоже, не работает в Postgres (9.3.5). Я получаю сообщение «Ошибка: несколько предложений ORDER BY не разрешены». Принятый ответ, однако, действительно работает в Postgres, как и ожидалось,
allenwlee
Спасибо за это! Этот запрос помог мне решить мою проблему. Я искал это часами
Аршад
1
Как я могу применить этот запрос с JOINS?
GYaN
@GYaN добавляет соединения во внутренний подзапрос
шейх хамза
9
SELECT * FROM table ORDER BY id DESC,datechat desc LIMIT 50

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

Вот что у меня сработало !!!! надеюсь, это поможет !!!!

aidonsnous
источник
7
SELECT * FROM table ORDER BY id DESC LIMIT 50

экономия ресурсов сделать один запрос, нет необходимости делать вложенные запросы

жужжание
источник
1
Ваш запрос вернет результаты в обратном порядке (по убыванию идентификатора). Запрос @newfurniturey получит ПОСЛЕДНИЕ вставленные строки ( LIMITидущие по убывающему идентификатору), а конечный результат будет иметь возрастающие идентификаторы.
Робин Кантерс
1
Ваше решение не будет получать результаты в правильном порядке, вместо этого они будут перевернуты, поэтому потребуется другой порядок, чтобы снова получить их в правильном порядке
Cobra47
1
Но затем вы просто выполняете php array_reverse () или что-то подобное на выбранном вами языке сценариев. База данных не обязана выполнять эту работу.
Джо
6
@Joe В вопросе нет ничего, что указывало бы на то, что используется язык сценариев, так что это небезопасное предположение.
Ник Кунс
Ожидаемый ответ уже должен быть отсортирован, используя только запрос к базе данных.
d4ryl3
-2
select * from Table ORDER BY id LIMIT 30

Примечания: * idдолжно быть уникальным. * Вы можете контролировать количество возвращаемых строк, заменив 30в запросе

Даршан
источник
1
Не могли бы вы объяснить свое решение? Объяснение в скобках похоже на код, поместите целое предложение над / под кодом. Спасибо
deHaar 05