Выбрать последние 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?

Ответы:


237

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

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

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


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) данными для каждой строки, поместите его как второй столбец в какие данные должны быть в порядке.

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.