Подтвердить что ты не робот

Mysql выбирает из n последних строк

У меня есть таблица с индексом (автоинкремент) и целочисленным значением. Таблица составляет миллионы строк.

Как я могу выполнить поиск, если наиболее эффективный номер в последних n строках таблицы отображается?

4b9b3361

Ответ 1

Начиная с ответа , данного @chaos, но с несколькими изменениями:

  • Вы всегда должны использовать ORDER BY, если используете LIMIT. Для таблицы РСУБД не гарантируется скрытый порядок. Обычно вы можете получать строки в порядке первичного ключа, но вы не можете полагаться на это, и он не переносится.

  • Если вы заказываете в порядке убывания, вам не нужно заранее знать количество строк в таблице.

  • Вы должны указать имя корреляции (aka alias) для производной таблицы.

Здесь моя версия запроса:

SELECT `id`
FROM (
    SELECT `id`, `val`
    FROM `big_table`
    ORDER BY `id` DESC
    LIMIT $n
) AS t
WHERE t.`val` = $certain_number;

Ответ 2

Воспользуйтесь преимуществами SORT и LIMIT, как и при разбивке на страницы. Если вы хотите i-й блок строк, используйте OFFSET.

SELECT val FROM big_table
where val = someval
ORDER BY id DESC
LIMIT n;

В ответ на Nir: Операция сортировки не обязательно наказывается, это зависит от того, что делает планировщик запросов. Поскольку этот случай использования имеет решающее значение для производительности разбивки на страницы, есть некоторые оптимизации (см. Ссылку выше). Это справедливо и в postgres, а "ORDER BY... LIMIT можно сделать без сортировки" E.7.1. Последний пуля

explain extended select id from items where val = 48 order by id desc limit 10;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | items | const | PRIMARY       | PRIMARY | 4       | const |    1 | Using index | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+

Ответ 3

Может быть, очень поздний ответ, но это хорошо и просто.

select * from table_name order by id desc limit 5

Этот запрос вернет набор из последних 5 значений (последние 5 строк), которые вы ввели в таблицу

Ответ 4

Последние 5 строк в mysql

Этот запрос отлично работает

SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC

или

select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc

Ответ 5

потому что это автоинкремент, вот мой прием:

Select * from tbl 
where certainconditionshere 
and autoincfield >= (select max(autoincfield) from tbl) - $n

Ответ 6

Я знаю, что это может быть немного старым, но попробуйте использовать PDO::lastInsertId. Я думаю, что он делает то, что вы хотите, но вам придется переписать свое приложение на использование PDO (что намного безопаснее против атак)