MYSQL - ЗАКАЗАТЬ И ОГРАНИЧИТЬ - PullRequest
220 голосов
/ 17 января 2011

У меня есть запрос, который выглядит так:

SELECT article FROM table1 ORDER BY publish_date LIMIT 20

Как работает ORDER BY? Будет ли он упорядочить все записи, затем получить первые 20 или 20 записей и упорядочить их по полю publish_date?

Если он последний, вам не гарантировано получить последние 20 статей.

Ответы [ 8 ]

225 голосов
/ 17 января 2011

Сначала он закажет, затем получит первые 20. База данных также обработает все, что указано в предложении WHERE до ORDER BY.

36 голосов
/ 17 января 2011

Предложение LIMIT может использоваться для ограничения количества строк, возвращаемых оператором SELECT.LIMIT принимает один или два числовых аргумента, которые оба должны быть неотрицательными целочисленными константами (кроме случаев использования подготовленных операторов).

С двумя аргументами первый аргумент задает смещение первой строки, которую нужно вернуть, а второй - максимальное количество строк, которые нужно вернуть.Смещение исходной строки равно 0 (не 1):

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15

Чтобы извлечь все строки от определенного смещения до конца результирующего набора, вы можете использовать несколько большихномер для второго параметра.Этот оператор извлекает все строки из 96-й строки до последней:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

С одним аргументом значение указывает количество строк, возвращаемых из начала набора результатов:

SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows

Другими словами, LIMIT row_count эквивалентна LIMIT 0, row_count.

Все подробности по: http://dev.mysql.com/doc/refman/5.0/en/select.html

8 голосов
/ 25 февраля 2012

Вы можете добавить [asc] или [desc] в конце заказа, чтобы получить самые ранние или самые последние записи

Например, сначала вы получите самые последние записи

ORDER BY stamp DESC

Добавить условие LIMIT после ORDER BY

7 голосов
/ 25 июня 2014

Так же, как @James говорит, он упорядочит все записи, затем получит первые 20 строк.

Таким образом, вы гарантированно получите 20 первых опубликованных статей, новые не будутпоказано.

В вашей ситуации я рекомендую вам добавить desc к order by publish_date, если вы хотите новые статьи, тогда самая новая статья будет первой.

Если вам нужносохраняйте результат в порядке возрастания и по-прежнему хотите, чтобы только 10 самых новых статей вы могли попросить mysql отсортировать ваш результат два раза.

Этот запрос, приведенный ниже, отсортирует результат по убыванию и ограничит результат 10 (это запрос в скобках).Он все равно будет отсортирован в порядке убывания, и мы не удовлетворены этим, поэтому мы просим mysql отсортировать его еще раз.Теперь у нас есть последний результат в последней строке.

select t.article 
from 
    (select article, publish_date 
     from table1
     order by publish_date desc limit 10) t 

order by t.publish_date asc;

Если вам нужны все столбцы, это делается так:

select t.* 
from 
    (select * 
     from table1  
     order by publish_date desc limit 10) t 

order by t.publish_date asc;

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

7 голосов
/ 17 января 2011

Если имеется подходящий индекс, в данном случае в поле publish_date, MySQL не нужно сканировать весь индекс, чтобы получить 20 запрошенных записей - 20 записей будут найдены в начале индекса. Но если подходящего индекса нет, потребуется полное сканирование таблицы.

Об этой статье есть Блог производительности MySQL с 2009 года.

5 голосов
/ 14 мая 2013

Вы можете использовать этот код SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10, где 0 - начальный предел записи & 10 количество записей

2 голосов
/ 17 января 2011

LIMIT обычно применяется как последняя операция, поэтому результат сначала будет отсортирован, а затем ограничен 20. Фактически сортировка остановится, как только будут найдены первые 20 отсортированных результатов.

0 голосов
/ 17 июня 2016

Также синтаксис LIMIT отличается в зависимости от базы данных, например:

mysql - LIMIT 1, 2

postgres - LIMIT 2 OFFSET 1

...