Mam zapytanie, które wygląda następująco:
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
Jak działa ORDER BY? Czy zamówi wszystkie rekordy, a następnie zdobędzie pierwsze 20, czy też otrzyma 20 rekordów i zamówi je według publish_date
pola?
Jeśli to ostatni, nie masz gwarancji, że naprawdę otrzymasz najnowsze 20 artykułów.
mysql
sql
sql-order-by
sql-limit
Alex
źródło
źródło
publish_date
s są równe, ich uporządkowanie nie daje określonych wyników, co oznacza, że jeśli użyjeszLIMIT
paginacji, możesz dostać te same elementy na różnych stronach!Odpowiedzi:
Najpierw zamówi, a potem dostanie pierwsze 20. Baza danych będzie również przetwarzać wcześniej wszystko w tej
WHERE
klauzuliORDER BY
.źródło
LIMIT
przerwyORDER BY
. ZeLIMIT
wORDER BY
wyniku niewłaściwego powraca.LIMIT
w jakiś sposób porządkuje zestaw wyników zwrócony przezORDER BY
Klauzula LIMIT może służyć do ograniczenia liczby wierszy zwracanych przez instrukcję SELECT. LIMIT przyjmuje jeden lub dwa argumenty liczbowe, które muszą być nieujemnymi stałymi liczbami całkowitymi (z wyjątkiem sytuacji, gdy używane są przygotowane instrukcje).
W przypadku dwóch argumentów pierwszy argument określa przesunięcie pierwszego wiersza do zwrócenia, a drugi określa maksymalną liczbę wierszy do zwrócenia. Przesunięcie początkowego rzędu wynosi 0 (nie 1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Aby pobrać wszystkie wiersze od określonego przesunięcia do końca zestawu wyników, możesz użyć dużej liczby dla drugiego parametru. Ta instrukcja pobiera wszystkie wiersze od 96-tego wiersza do ostatniego:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
Za pomocą jednego argumentu wartość określa liczbę wierszy do zwrócenia od początku zestawu wyników:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
Innymi słowy, LIMIT liczba_wierszy jest równoważna LIMIT 0, liczba_wierszy.
Wszystkie szczegóły na: http://dev.mysql.com/doc/refman/5.0/en/select.html
źródło
Tak jak mówi @James, uporządkuje wszystkie rekordy, a następnie zdobędzie pierwsze 20 wierszy.
Ponieważ tak jest, masz gwarancję otrzymania 20 pierwszych opublikowanych artykułów, nowsze nie zostaną pokazane.
W sytuacji, polecam, aby dodać
desc
doorder by publish_date
, jeśli chcesz najnowsze artykuły, a następnie najnowszy artykuł będzie pierwszy.Jeśli chcesz zachować wynik w kolejności rosnącej i nadal chcesz tylko 10 najnowszych artykułów, możesz poprosić mysql o dwukrotne posortowanie wyniku.
To zapytanie poniżej posortuje wynik malejący i ograniczy wynik do 10 (to jest zapytanie w nawiasie). Nadal będzie sortowany w porządku malejącym i nie jesteśmy z tego zadowoleni, dlatego prosimy mysql o posortowanie go jeszcze raz. Teraz mamy najnowszy wynik w ostatnim wierszu.
Jeśli potrzebujesz wszystkich kolumn, robi się to w następujący sposób:
Używam tej techniki, gdy ręcznie piszę zapytania, aby sprawdzić bazę danych pod kątem różnych rzeczy. Nie korzystałem z niego w środowisku produkcyjnym, ale teraz, kiedy go zaznaczam, dodatkowe sortowanie nie wpływa na wydajność.
źródło
Jeśli istnieje odpowiedni indeks, w tym przypadku na
publish_date
polu, to MySQL nie musi skanować całego indeksu, aby uzyskać 20 żądanych rekordów - 20 rekordów znajdzie się na początku indeksu. Ale jeśli nie ma odpowiedniego indeksu, konieczne będzie pełne skanowanie tabeli.Jest artykuł na blogu MySQL Performance z 2009 roku.
źródło
Możesz dodać [asc] lub [desc] na końcu zamówienia, aby uzyskać najwcześniejsze lub najnowsze rekordy
Na przykład najpierw otrzymają najnowsze rekordy
Dodaj
LIMIT
klauzulę poORDER BY
źródło
Możesz użyć tego kodu,
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
gdzie 0 jest początkowym limitem rekordu i 10 liczbą rekordówźródło
LIMIT 10
jest skrótem odLIMIT 0,10
.LIMIT jest zwykle stosowany jako ostatnia operacja, więc wynik najpierw zostanie posortowany, a następnie ograniczony do 20. W rzeczywistości sortowanie zatrzyma się, gdy tylko zostanie znalezionych pierwszych 20 posortowanych wyników.
źródło
Również składnia LIMIT jest różna w zależności od baz danych, na przykład:
mysql
- LIMIT 1, 2postgres
- LIMIT 2 PRZESUNIĘCIE 1źródło