Ich habe eine Abfrage, die so aussieht:
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
Wie funktioniert ORDER BY? Wird es alle Datensätze bestellen und dann die ersten 20 erhalten, oder wird es 20 Datensätze erhalten und sie nach publish_date
Feld sortieren?
Wenn es der letzte ist, ist nicht garantiert, dass Sie wirklich die neuesten 20 Artikel erhalten.
mysql
sql
sql-order-by
sql-limit
Alex
quelle
quelle
publish_date
s gleich sind, die Reihenfolge nach ihnen keine bestimmten Ergebnisse liefert. Wenn Sie sieLIMIT
für die Paginierung verwenden, erhalten Sie möglicherweise dieselben Elemente auf verschiedenen Seiten!Antworten:
Es wird zuerst bestellt, dann die ersten 20. Eine Datenbank verarbeitet auch alles in der
WHERE
vorherigen KlauselORDER BY
.quelle
LIMIT
brichtORDER BY
. MitLIMIT
einemORDER BY
falschen Ergebnis.LIMIT
ordnet irgendwie die Ergebnismenge neu, die vonORDER BY
Die LIMIT-Klausel kann verwendet werden, um die Anzahl der von der SELECT-Anweisung zurückgegebenen Zeilen zu beschränken. LIMIT verwendet ein oder zwei numerische Argumente, die beide nichtnegative Ganzzahlkonstanten sein müssen (außer bei Verwendung vorbereiteter Anweisungen).
Bei zwei Argumenten gibt das erste Argument den Versatz der ersten zurückzugebenden Zeile und das zweite die maximale Anzahl der zurückzugebenden Zeilen an. Der Versatz der ersten Zeile ist 0 (nicht 1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Um alle Zeilen von einem bestimmten Versatz bis zum Ende der Ergebnismenge abzurufen, können Sie für den zweiten Parameter eine große Zahl verwenden. Diese Anweisung ruft alle Zeilen von der 96. bis zur letzten Zeile ab:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
Mit einem Argument gibt der Wert die Anzahl der Zeilen an, die vom Anfang der Ergebnismenge zurückgegeben werden sollen:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
Mit anderen Worten, LIMIT row_count entspricht LIMIT 0, row_count.
Alle Details unter: http://dev.mysql.com/doc/refman/5.0/en/select.html
quelle
Genau wie @James sagt, werden alle Datensätze sortiert und dann die ersten 20 Zeilen abgerufen.
Da dies der Fall ist, erhalten Sie garantiert die 20 zuerst veröffentlichten Artikel, die neueren werden nicht angezeigt.
In Ihrer Situation, empfehle ich Ihnen , fügen Sie
desc
zuorder by publish_date
, wenn Sie die neuesten Artikel wollen, dann werden die neuesten Artikel zuerst sein.Wenn Sie das Ergebnis in aufsteigender Reihenfolge halten möchten und dennoch nur die 10 neuesten Artikel möchten, können Sie mysql bitten, Ihr Ergebnis zweimal zu sortieren.
Diese Abfrage unten sortiert das Ergebnis absteigend und begrenzt das Ergebnis auf 10 (das ist die Abfrage in Klammern). Es wird weiterhin in absteigender Reihenfolge sortiert, und wir sind damit nicht zufrieden. Deshalb bitten wir mysql, es noch einmal zu sortieren. Jetzt haben wir das neueste Ergebnis in der letzten Zeile.
Wenn Sie alle Spalten benötigen, geschieht dies folgendermaßen:
Ich verwende diese Technik, wenn ich manuell Abfragen schreibe, um die Datenbank auf verschiedene Dinge zu untersuchen. Ich habe es nicht in einer Produktionsumgebung verwendet, aber jetzt, wenn ich es als Benchmark markiert habe, wirkt sich die zusätzliche Sortierung nicht auf die Leistung aus.
quelle
Wenn es einen geeigneten Index gibt, in diesem Fall auf dem
publish_date
Feld, muss MySQL nicht den gesamten Index scannen, um die 20 angeforderten Datensätze zu erhalten - die 20 Datensätze werden am Anfang des Index gefunden. Wenn jedoch kein geeigneter Index vorhanden ist, ist ein vollständiger Scan der Tabelle erforderlich.Dazu gibt es einen MySQL Performance Blog-Artikel aus dem Jahr 2009.
quelle
Sie können am Ende der Bestellung [asc] oder [desc] hinzufügen, um die frühesten oder neuesten Datensätze zu erhalten
Auf diese Weise erhalten Sie beispielsweise zuerst die neuesten Datensätze
Fügen Sie die
LIMIT
Klausel nachORDER BY
quelle
Sie können diesen Code verwenden,
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
wobei 0 ein Startlimit für den Datensatz und 10 für den Datensatz istquelle
LIMIT 10
ist eine Abkürzung fürLIMIT 0,10
.LIMIT wird normalerweise als letzte Operation angewendet, sodass das Ergebnis zuerst sortiert und dann auf 20 begrenzt wird. Tatsächlich wird die Sortierung beendet, sobald die ersten 20 sortierten Ergebnisse gefunden werden.
quelle
Auch die Syntax von LIMIT unterscheidet sich je nach Datenbank, zum Beispiel:
mysql
- GRENZWERT 1, 2postgres
- LIMIT 2 OFFSET 1quelle