Frage

Ich habe eine Abfrage, dass sieht wie folgt aus:

SELECT article FROM table1 ORDER BY publish_date LIMIT 20

Wie funktioniert ORDER BY Arbeit? Wird es alle Datensätze zu bestellen, dann die ersten 20 erhalten, oder wird es 20 Datensätze zu erhalten und um sie durch das publish_date Feld?

Wenn es das letzte ist, sind Sie nicht garantiert, um wirklich die letzten 20 Artikel erhalten.

War es hilfreich?

Lösung

Es wird zuerst bestellen, dann erhält die erste 20. Eine Datenbank wird auch Prozess etwas in der WHERE Klausel vor ORDER BY.

Andere Tipps

Die LIMIT-Klausel kann verwendet werden, um die Anzahl der Zeilen, die von der SELECT-Anweisung zurück zu beschränken. LIMIT nimmt ein oder zwei numerische Argumente, die sowohl nicht-negativen ganzzahlige Konstanten sein muss (außer wenn vorbereitete Anweisungen verwenden).

mit zwei Argumenten, wobei die ersten Argument gibt den Offset der ersten Zeile zurückzukehren, und die zweite gibt die maximale Anzahl von Zeilen zurück. Der Versatz der Anfangsreihe ist 0 (nicht 1):

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

Um alle Zeilen abrufen von einem bestimmten bis zum Ende der Ergebnismenge verrechnet, Sie einige große Zahl für den zweiten Parameter verwenden können. Diese Anweisung ruft alle Zeilen aus der 96th bis zur letzten Reihe:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

Mit einem Argument gibt der Wert die Anzahl der Zeilen von Anfang an der Ergebnismenge zurück:

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

Mit anderen Worten, ist LIMIT row_count entspricht LIMIT 0, row_count.

Alle Details an: http://dev.mysql.com/ doc / refman / 5.0 / de / select.html

Wenn ein geeigneter Index ist in diesem Fall auf dem publish_date Feld, dann braucht MySQL nicht den ganzen Index scannen die 20 Datensätze angefordert zu bekommen - die 20 Datensätze werden am Anfang des Index zu finden. Aber wenn es kein geeigneter Index, dann ein Scan der Tabelle benötigt werden.

Es gibt ein MySQL Performance-Blog Artikel von 2009 zu diesem Thema.

Sie könnten [auf] hinzufügen oder [ab] am Ende der Bestellung durch die frühesten oder spätesten Aufzeichnungen zu bekommen

Zum Beispiel, dies werden Sie die neuesten Datensätze zuerst

ORDER BY stamp DESC

Fügen Sie die LIMIT Klausel nach ORDER BY

Wie @James sagt, wird es alle Datensätze bestellen, dann erhalten die ersten 20 Zeilen.

Wie es so ist, werden Sie garantiert die 20 ersten veröffentlichten Artikel zu bekommen, werden die neueren nicht gezeigt werden.

In Ihrer Situation, empfehle ich, dass Sie desc zu order by publish_date hinzufügen, wenn Sie die neuesten Artikeln wollen, dann wird der neueste Artikel zuerst sein.

Wenn Sie das Ergebnis zu halten brauchen, um in aufsteigend, und wollen nach wie vor nur die 10 neuesten Artikel können Sie mysql fragen Sie Ihr Ergebnis zweimal zu sortieren.

Diese Abfrage unten wird das Ergebnis absteigende und begrenzen das Ergebnis 10 sortieren (das ist die Abfrage in der Klammer). Es wird nach wie vor in absteigender Reihenfolge sortiert werden, und wir sind nicht damit zufrieden, so dass wir mysql bitten, es noch einmal zu sortieren. Jetzt haben wir das neueste Ergebnis in der letzten Zeile.

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

order by t.publish_date asc;

Wenn Sie alle Spalten benötigen, ist es auf diese Weise:

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

order by t.publish_date asc;

Ich verwende diese Technik, wenn ich manuell Abfragen schreiben, die Datenbank für verschiedene Dinge zu untersuchen. Ich habe es nicht in einer Produktionsumgebung, aber jetzt, wenn ich es Bank markiert, die zusätzliche Sortierung die Leistung nicht beeinträchtigen.

Sie können diesen Code verwenden SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10 wobei 0 eine Startgrenze der Aufzeichnung und 10 Anzahl der Datensatz

LIMIT in der Regel als letzte Operation angewendet wird, so wird das Ergebnis zuerst sortiert werden und dann auf 20. In der Tat begrenzt, stoppt das Sortieren, sobald die ersten 20 Ergebnisse sortiert zu finden sind.

Auch von LIMIT Syntax unterscheidet sich nach Datenbanken, zum Beispiel:

mysql - LIMIT 1, 2

postgres - LIMIT 2 OFFSET 1

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top