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


181

Як я можу SELECTостанній рядок у таблиці MySQL?

Я використовую INSERTдані, і мені потрібно отримати значення стовпця з попереднього рядка.

Там auto_incrementв таблиці.


8
Визначте "останній рядок". Той, хто має найбільше посвідчення? Або останній доданий?
EboMike

1
Що вказує на останній рядок - чи в таблиці стовпчик auto_increment або DATETIME?
OMG Ponies

Так, там auto_incrementє. Мені б хотілося останнього доданого.
esqew

9
Немає останнього ряду в наборі, як сказали EboMike та OMG Ponies. Що б ти зробив, якби я дав тобі мішок, повний кульок, і попросив би дати мені останній бал?
Вінсент Савард

Відповіді:


402

Так, там є автоматичне збільшення

Якщо ви хочете останнього з усіх рядків таблиці, то це, нарешті, час, коли MAX(id)вірна відповідь! Типу:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;

12
Я боюся, що це стає повільним, якщо йому потрібно сортувати мільйон рядків, чи не так?
Слава

2
Я щойно пробіг це понад 20м рядків, і це було дуже швидко. Я припускаю, що існує якийсь особливий випадок для обробки цього запиту. (EDIT: MySQL 5.7, двигун InnoDB)
Даніель Бакмастер

1
@ Пекка: Я не хочу використовувати замовлення, чи є інший варіант зробити це?
шива

4
@Slawa Не idіндексується.
Маркіз Лорн

31

Майте на увазі, що таблиці у реляційних базах даних - це лише набори рядків. І множини з математики - це не упорядковані колекції. Немає першого чи останнього ряду; немає попереднього чи наступного рядка.

Вам доведеться спочатку сортувати набір не упорядкованих рядків за деяким полем, а потім ви звільняєте ітерацію через набір результатів у визначеному вами порядку.

Оскільки у вас є поле з автоматичним збільшенням, я вважаю, що ви хочете це поле для сортування. У цьому випадку ви можете зробити наступне:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

Подивіться, як ми спочатку сортуємо набір не упорядкованих рядків за your_auto_increment_field(або так, як ви його називали) у порядку зменшення. Тоді ми обмежуємо набір результатів лише першим рядом LIMIT 1.


25

Ви можете поєднати два запити, запропоновані @spacepille, в один запит, який виглядає приблизно так:

SELECT * FROM `table_name` WHERE id=(SELECT MAX(id) FROM `table_name`);

Це повинно працювати швидко, але в таблицях INNODB це частка мілісекунди повільніше, ніж ORDER + LIMIT.


@karthikeyan написав свою відповідь чотири дні тому, і я відповів на це у грудні 2015 року
vzr

ні, я відредагував і виправив деякі правописи 4 дні тому ... дата публікації - це 2014 рік answered Jun 14 at 9:41приблизно на 1 рік і 6 місяців раніше :)
Dwza

Просто для очищення повітря тут взр правильно. "14 червня" означає, 14 червня 2016 року також @karthikeyan був членом лише два місяці.
Роберт Брізіта

Ssooo ... @ відповідь karthikeyan - це копія цього!
Кліфф Бертон

24

на таблицях з багатьма рядками два запити, ймовірно, швидше ...

SELECT @last_id := MAX(id) FROM table;

SELECT * FROM table WHERE id = @last_id;

6

Зробити це просто: PDO::lastInsertId

http://php.net/manual/en/pdo.lastinsertid.php


2
Правильно. Більшість гідних бібліотек інтерфейсів MySQL мають спеціальні методи для цього, однак це питання не позначалось PHP, а загальним синтаксисом MySQL.
vzr

4

Якщо ви хочете останню додану, додайте часову позначку та виберіть упорядкований у зворотному порядку найвищий часовий відміток, ліміт 1. Якщо ви хочете перейти за ідентифікатором, відсортуйте за ідентифікатором. Якщо ви хочете скористатись тим, що ви ДОСТАВКИ додали, використовуйте mysql_insert_id.


4

Практично в кожній таблиці бази даних є стовпець auto_increment (як правило, ідентифікатор)

Якщо ви хочете останній з усіх рядків таблиці,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

АБО

Ви можете об'єднати два запити в один запит, який виглядає приблизно так:

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);

автоматичний приріст існує лише в тому випадку, якщо DBA (або хто зробив таблицю) реалізував автоматичні збільшення
WhatsThePoint

2
SELECT * FROM adds where id=(select max(id) from adds);

Цей запит був використаний для отримання останнього запису у вашій таблиці.


Копія відповіді нижче
Jbur43

2

Багато відповідей тут говорять те саме (порядок автоматичного збільшення), що добре, за умови наявності індексованого стовпця з автоматичним збільшенням.

На стороні записки, якщо у вас є таке поле , і воно є первинним ключем, немає продуктивності штрафу за використання order byпроти select max(id). Первинний ключ полягає в тому, як упорядковуються дані у файлах баз даних (принаймні для InnoDB), і RDBMS знає, де закінчуються ці дані, і він може оптимізуватиorder by id + limit 1 щоб бути таким же, як досягтиmax(id)

Тепер дорога, яка менше проїжджає, - це коли у вас немає автоматичного збільшення первинного ключа. Можливо, первинний ключ - це природний ключ, який є складовою з 3-х полів ... Не все ж втрачено. З мови програмування спочатку можна отримати кількість рядків

SELECT Count(*) - 1 AS rowcount FROM <yourTable>;

а потім використовувати отримане число в LIMITпункті

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

На жаль, MySQL не дозволить вводити підзапит або змінну користувача в LIMITпункті


1

Ви можете використовувати OFFSETв LIMITкоманді:

SELECT * FROM aTable LIMIT 1 OFFSET 99

на випадок, якщо у вашій таблиці є 100 рядків, повертайте останній рядок, не покладаючись на основну_вітку

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