Ich möchte eine Abfrage erstellen, die alle Ergebnisse in einer Tabelle anzeigt, aber vom Anfang der Tabelle um 5 versetzt ist. Soweit ich das beurteilen kann, LIMIT
erfordert MySQL sowohl ein Limit als auch einen Offset. Gibt es eine Möglichkeit, dies zu tun?
114
limit 5000, 18446744073709551615
. Sie werden keine zusätzlichen 5000 Zeilen abrufen, nur damit Ihr Code hübsch aussieht.Antworten:
Aus dem MySQL-Handbuch zu LIMIT :
quelle
Limit -1
oder sehenLimit Null
ziemlich vernünftig aus! oder mindestens Limit sollte eine Unterabfrage wieselect * from table limit (select count(*) from table)
Wie Sie bereits erwähnt haben, ist LIMIT erforderlich, daher müssen Sie das größtmögliche Limit verwenden, nämlich 18446744073709551615 (maximal BIGINT ohne Vorzeichen).
quelle
Wie in anderen Antworten erwähnt, schlägt MySQL vor, 18446744073709551615 als Anzahl der Datensätze im Limit zu verwenden. Beachten Sie jedoch Folgendes: Was würden Sie tun, wenn Sie 18.446.744.073.709.551.615 Datensätze zurückerhalten würden? Was würden Sie tun, wenn Sie 1.000.000.000 Datensätze hätten?
Vielleicht möchten Sie mehr als eine Milliarde Datensätze, aber mein Punkt ist, dass die Anzahl der gewünschten Datensätze begrenzt ist und weniger als 18 Billionen beträgt. Aus Gründen der Stabilität, Optimierung und möglicherweise Benutzerfreundlichkeit würde ich vorschlagen, die Abfrage sinnvoll einzuschränken. Dies würde auch die Verwirrung für jeden verringern, der diese magisch aussehende Zahl noch nie gesehen hat, und den zusätzlichen Vorteil haben, mindestens zu kommunizieren, wie viele Datensätze Sie gleichzeitig verarbeiten möchten.
Wenn Sie wirklich alle 18 Billionen Datensätze aus Ihrer Datenbank abrufen müssen, möchten Sie sie möglicherweise in Schritten von 100 Millionen abrufen und 184 Milliarden Mal durchlaufen.
quelle
Ein anderer Ansatz wäre, eine automatisch inkrementierte Spalte auszuwählen und sie dann mit HAVING zu filtern.
Aber ich würde mich wahrscheinlich an den High-Limit-Ansatz halten.
quelle
$sql = 'SET @a :=0 SELECT .....';
Wie bereits erwähnt, aus dem MySQL-Handbuch. Um dies zu erreichen, können Sie den Maximalwert eines vorzeichenlosen Big Int verwenden, dh diese schreckliche Zahl (18446744073709551615). Aber um es ein bisschen weniger chaotisch zu machen, können Sie den bitweisen Operator "~" verwenden.
es funktioniert als bitweise Negation. Das Ergebnis von "~ 0" ist 18446744073709551615.
quelle
LIMIT 5, ~0
undLIMIT ~0 OFFSET 5
Ist das eine MySQL 8.0 - Funktion.?Erst heute habe ich gelesen, wie man am besten große Datenmengen (mehr als eine Million Zeilen) aus einer MySQL-Tabelle abruft. Eine Möglichkeit ist, wie vorgeschlagen, mit
LIMIT x,y
denenx
der Offset undy
die letzte Zeile zurückgegeben werden soll. Wie ich jedoch herausgefunden habe, ist dies nicht der effizienteste Weg, dies zu tun. Wenn Sie eine Autoincrement-Spalte haben, können Sie genauso einfach eineSELECT
Anweisung mit einerWHERE
Klausel verwenden, die angibt, von welchem Datensatz Sie beginnen möchten.Beispielsweise,
SELECT * FROM table_name WHERE id > x;
Es scheint, dass MySQL alle Ergebnisse erhält, wenn Sie es verwenden,
LIMIT
und Ihnen dann nur die Datensätze anzeigt, die in den Offset passen: nicht die beste Leistung.Quelle: Antwort auf diese Frage MySQL-Foren . Beachten Sie nur, dass die Frage ungefähr 6 Jahre alt ist.
quelle
Sie können eine MySQL-Anweisung mit LIMIT verwenden:
Getestet in MySQL 5.5.44. Somit können wir das Einfügen der Nummer 18446744073709551615 vermeiden.
Hinweis: Die Transaktion stellt sicher, dass die Variable @rows mit der Tabelle übereinstimmt, die bei der Ausführung der Anweisung berücksichtigt wird.
quelle
Ich weiß, dass dies alt ist, aber ich habe keine ähnliche Antwort gesehen, daher ist dies die Lösung, die ich verwenden würde.
Zuerst würde ich eine Zählabfrage für die Tabelle ausführen, um zu sehen, wie viele Datensätze vorhanden sind. Diese Abfrage ist schnell und normalerweise ist die Ausführungszeit vernachlässigbar. Etwas wie:
Dann würde ich meine Abfrage mit dem Ergebnis erstellen, das ich von count als mein Limit erhalten habe (da dies die maximale Anzahl von Zeilen ist, die die Tabelle möglicherweise zurückgeben könnte). Etwas wie:
Oder vielleicht so etwas wie:
Bei Bedarf können Sie natürlich den gewünschten Versatz von count_result abziehen, um einen tatsächlichen, genauen Wert zu erhalten, der als Grenzwert angegeben werden soll. Das Übergeben des Werts "18446744073709551610" ist nur dann sinnvoll, wenn ich tatsächlich einen geeigneten Grenzwert festlegen kann.
quelle
id kann jede automatisch inkrementierte oder eindeutige numerische Spalte sein, die Sie haben ...
quelle