Выберите последнюю строку в MySQL


181

Как я могу SELECTпоследнюю строку в таблице MySQL?

Я INSERTсобираю данные, и мне нужно получить значение столбца из предыдущей строки.

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


8
Определите «последний ряд». Тот, у кого самый высокий ID? Или последний добавленный?
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 метров, и это было очень быстро. Я предполагаю, что есть какой-то особый случай для обработки этого запроса. (РЕДАКТИРОВАТЬ: MySQL 5.7, движок InnoDB)
Даниэль Бакмастер,

1
@Pekka: я не хочу использовать заказ, есть ли другой способ сделать это?
Шива

4
@ Слава Нет, если 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 (обычно id)

Если вы хотите, чтобы последняя из всех строк в таблице,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

ИЛИ

Вы можете объединить два запроса в один запрос, который выглядит следующим образом:

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

автоинкремент
доступен

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

Этот запрос используется для получения последней записи в вашей таблице.


Копия ответа ниже
Jbur43

2

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

Напомним, что если у вас есть такое поле, и оно является первичным ключом, не будет никакого снижения производительности за использование по order byсравнению с select max(id). Первичный ключ - это порядок упорядочения данных в файлах базы данных (по крайней мере, для InnoDB), и СУБД знает, где заканчиваются эти данные, и она может оптимизироваться так, 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 строк, это возвращает последнюю строку, не полагаясь на primary_key

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