it-swarm.com.ru

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

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

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

65
Nir

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

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

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

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

Вот моя версия запроса:

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

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

select * from table_name order by id desc limit 5

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

17
Suganthan Madhavan Pillai

Последние 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
13
M Palani Mca

Воспользуйтесь преимуществами сортировки и ограничения, как если бы вы использовали нумерацию страниц. Если вам нужен 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 | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
12
Dana the Sane

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

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

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

0
Luke Madhanga