У меня есть запрос, который выглядит так:
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
Как работает ORDER BY? Будет ли он упорядочить все записи, затем получить первые 20 или 20 записей и упорядочить их по publish_date
полю?
Если это последний, вы не гарантированно получите последние 20 статей.
publish_date
s одинаковы, их упорядочение не дает определенных результатов, а это означает, что если вы используетеLIMIT
нумерацию страниц, вы можете получить одинаковые элементы на разных страницах!Ответы:
Сначала он закажет, затем получит первые 20. База данных также обработает все, что в
WHERE
предложении ранееORDER BY
.источник
LIMIT
перерывыORDER BY
. СLIMIT
вORDER BY
результате возвращает неправильный.LIMIT
каким-то образом переупорядочивает набор результатов, возвращенныйORDER BY
Предложение 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
источник
Как говорит @James, он упорядочит все записи, а затем получит первые 20 строк.
Так как это так, вы гарантированно получите 20 первых опубликованных статей, более новые не будут показаны.
В вашей ситуации я рекомендую добавить
desc
кorder by publish_date
, если вы хотите , то самые новые статьи, то новейшая статья будет первой.Если вам нужно сохранить результат в порядке возрастания, и при этом вам нужны только 10 самых новых статей, вы можете попросить mysql отсортировать результаты два раза.
Приведенный ниже запрос сортирует результат по убыванию и ограничивает результат 10 (это запрос в скобках). Он все равно будет отсортирован в порядке убывания, и мы не удовлетворены этим, поэтому мы просим mysql отсортировать его еще раз. Теперь у нас самый новый результат в последнем ряду.
Если вам нужны все столбцы, это делается так:
Я использую эту технику, когда пишу запросы вручную, чтобы исследовать базу данных на предмет различных вещей. Я не использовал его в производственной среде, но теперь, когда я его отмечал, дополнительная сортировка не влияет на производительность.
источник
Если имеется подходящий индекс, в данном случае на
publish_date
поле, MySQL не нужно сканировать весь индекс, чтобы получить 20 запрошенных записей - 20 записей будут найдены в начале индекса. Но если подходящего индекса нет, потребуется полное сканирование таблицы.Об этом есть статья в MySQL Performance Blog за 2009 год.
источник
Вы можете добавить [asc] или [desc] в конце заказа, чтобы получить самые ранние или последние записи
Например, это даст вам последние записи в первую очередь
Добавить
LIMIT
пункт послеORDER BY
источник
Вы можете использовать этот код,
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
где 0 - начальный предел записи и 10 номеров записи.источник
LIMIT 10
это сокращение дляLIMIT 0,10
.LIMIT обычно применяется в качестве последней операции, поэтому результат будет сначала отсортирован, а затем ограничен 20. Фактически сортировка остановится, как только будут найдены первые 20 отсортированных результатов.
источник
Также синтаксис LIMIT отличается в зависимости от базы данных, например:
mysql
- ПРЕДЕЛ 1, 2postgres
- ПРЕДЕЛ 2 ОФСЕТ 1источник