50 Einträge neuesten Datums abfragen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
nvidia
User
Beiträge: 31
Registriert: Freitag 11. Februar 2011, 16:46

Code: Alles auswählen

//Pseudocode
Abfrage = "SELECT val, date FROM table WHERE val='blabla' AND val2='bubu' ORDER BY DATE DESC"
Abfrage[0:50]
Hallo geht das hier auch nur mit der Datenbank, so das ich nicht unnötig alle anderen Reihen abfragen muss und dann am schluss den rest trennen muss.
Mit Limit 50 funktioniert das nicht, weil sich dann ORDER BY nicht auf alle Einträge bezieht, sondern nur auf die 50 ausgewählten.
BlackJack

@nvidia: Sicher dass das mit LIMIT nicht geht? Welches DBMS steht denn dahinter?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:@nvidia: Sicher dass das mit LIMIT nicht geht? Welches DBMS steht denn dahinter?
Afair ist LIMIT kein SQL-Standard und wurde (wird?) daher tatsächlich von DBs wie Oracle nicht implementiert. Zumindest bin ich da mal vor Jahren bei einer SQL-Nachhilfe drüber gestoßen, wo der Prof die Studis mit einer netten verschachtelten Query diesbezüglich gequält hat. Hatte mich damals selber gewundert, da ich das einfach mittels LIMIT gelöst hatte.

Evtl. ist Dir das aber auch bewusst; Deine Nachfrage kann man so oder so interpretieren :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Das war mir bewusst, deshalb habe ich auch gefragt. Bei PostgreSQL und SQLite wird das LIMIT erst am Schluss angewendet. Ich kann mir aber auch kaum vorstellen dass es DBMS gibt, die das anders handhaben, denn sonst wäre das IMHO ziemlich nutzlos in der Praxis.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

MySQL wendet LIMIT auch am Ende an. IMHO macht LIMIT auch nichts anderes, als die Ausgabe des Abfrageergebnisses auf X Zeilen zu beschränken.

Sonst könnten auch (MySQL-) Abfragen wie

Code: Alles auswählen

SELECT foo, bar FROM spamegg LIMIT 30,10
gar nicht funktionieren...

Gruß, noisefloor
deets

Hyperion hat geschrieben:
BlackJack hat geschrieben:@nvidia: Sicher dass das mit LIMIT nicht geht? Welches DBMS steht denn dahinter?
Afair ist LIMIT kein SQL-Standard und wurde (wird?) daher tatsächlich von DBs wie Oracle nicht implementiert. Zumindest bin ich da mal vor Jahren bei einer SQL-Nachhilfe drüber gestoßen, wo der Prof die Studis mit einer netten verschachtelten Query diesbezüglich gequält hat. Hatte mich damals selber gewundert, da ich das einfach mittels LIMIT gelöst hatte.
Das Problem bei ORACLE ist nicht LIMIT, sonder OFFSET (oder das LIMIT-mit-zwei-Argumenten). LIMIT bekommt man naemlich mit ROWNUM gebastelt (ROWNUM < X), aber OFFSET nicht. Damit muss man dann entweder alles vor dem OFFSET wegwerfen, oder man baut eine nested Query, die das serverseitig tut - aber an Effizienz verliert.
Letztlich muessen aber alle DBs die Ordnung ueber alle Zeilen berechnen, wirklich viel verlieren tut man also nicht.
Edit: das ist natuerlich Unsinn was ich da schrieb. Eine DB mit Limit kann natuerlich nur bis zum gewuenschten Limit sortieren - das spart schon was. Nicht die Welt, aber wenn ich schon klugscheisse... :oops:
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

deets hat geschrieben:Eine DB mit Limit kann natuerlich nur bis zum gewuenschten Limit sortieren - das spart schon was. Nicht die Welt, aber wenn ich schon klugscheisse... :oops:
Plötzlich wird das simple Bubblesort wieder interessant.
Antworten