Виберіть останні My рядки з MySQL


121

Я хочу вибрати останні 50 рядків із бази даних MySQL в колонці з ідентифікатором, яка є первинним ключем . Мета полягає в тому, що рядки повинні бути відсортовані за ідентифікатором у порядку 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?

Відповіді:


236

Ви можете зробити це з підзапитом:

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 запит отримає ОСТАННІ вставлені рядки ( LIMITing за низхідним id), а кінцевий результат матиме зростаючі ідентифікатори.
Робін Кантерс

1
Ваше рішення не приведе до результатів у правильному порядку, замість цього воно
перетворить

1
Але тоді ви просто зробите php array_reverse () або будь-який інший еквівалент у вибраній вами мові сценарію. Базі даних не потрібно робити цю роботу.
Джо

6
@Joe У питанні немає нічого, що вказує на те, що мова сценаріїв використовується, тому це не є надійним припущенням.
Нік Кунс

Очікувана відповідь має бути вже відсортовано за допомогою просто запиту до бази даних.
d4ryl3

-2
select * from Table ORDER BY id LIMIT 30

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


1
Не могли б ви пояснити своє рішення? Пояснення в дужках, схоже, є кодом, над / під кодом поставте ціле речення. Спасибі
deHaar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.