hi,
Beide Queries liefern die gleichen Ergebnisse außer bei Extra:
MAX(): Using where
ORDER BY/LIMIT: Using where; using filesort
Ja, kann ich im Test nachvollziehen.
Wie von dedlfix ebenfalls schon vermutet - wenn auf der Spalte ein Index liegt, bekomme ich für die zweite Variante aber das gleiche Ergebnis - Extra: Using where
Von daher denke ich, dass die Kombination ORDER BY/LIMIT, auch wenn sie das gewünschte Ergebnis liefert, keine gute Idee ist.
Ja, ihr habt mich überzeugt - insb. das MAX() intuitiver und portabler ist.
Da möchte ich dann gleich eine Frage anschließen:
Für mein Weblog möchte ich bei der Anzeige eines Beitrages auch die Daten haben, die ich zur Verlinkung des vorherigen und nächsten Eintrages benötige.
Ich habe mir überlegt, wie ich das mit Subselects in einer Query machen kann, und bin zu folgendem Recht simplen Ergebnis gekommen:
SELECT *,
( SELECT bkey
FROM blog b2
WHERE b2.bdate > b1.bdate
ORDER BY b2.bdate ASC
LIMIT 1
) AS prev,
( SELECT bkey
FROM blog b2
WHERE b2.bdate < b1.bdate
ORDER BY b2.bdate DESC
LIMIT 1
) AS next
FROM blog b1
WHERE bkey = 'testeintrag'
(Stört euch zunächst mal bitte nicht am SELECT *, das ist erstmal nur für den Test.)
Sinn des Querys ist, dass ich alle benötigten Daten zum aktuellen Eintrag erhalte, und in den Pseudo-Spalten prev und next den bkey des vorherigen/nächsten (sofern vorhanden, sonst NULL) - und das in einem einzigen Datensatz.
(bkey ist ein Textstring, den ich zur eindeutigen Identifikation eines Eintrages benutze - soll für den Abruf über per mod_rewrite "sprechend" gestaltete URLs dienen, da ich von der Datensatz-ID im URL weg möchte.)
Klappt soweit auch ganz gut - aber beim EXPLAIN der Query bekomme ich auch hier für Extra wieder Using where; Using filesort angezeigt, wenn ich den Index auf der Spalte bdate entferne. Ich hatte vorher einen Index drauf, den ich jetzt zum Testen mal wieder verworfen habe - allerdings denke ich, für eine Spalte, die häufig zum sortieren der Datensätze benötigt wird, ein Index ja durchaus angebracht sein dürfte.
Ich habe jetzt überlegt, ob ich auch hier in den beiden Subqueries ORDER BY/LIMIT 1 irgendwie durch MIN/MAX ersetzen kann - komme aber auf keinen sinnvollen Einsatz dieser Aggregatfunktionen an dieser Stelle.
Gibt es überhaupt einen?
Meine Probleme dabei:
- ich will ja nicht das absolute Maximum/Minimum des Zeitstempels über alle Einträge, sondern jeweils nur aus einer eingeschränkten Menge - aus der aller Datensätze, deren Zeitstempel kleiner bzw. größer als der des aktuellen Eintrages ist.
- ich will ja nicht den Wert aus der Spalte auslesen, deren maximalen/minimalen Wert ich suche (bdate), sondern den dazugehörigen aus einer anderen Spalte (bkey).
(Falls der Aufbau der Tabelle nicht ausreichend klar ist, kann ich diesen gerne nachliefern.
MySQL-Version ist aktuell 4.1.18-nt, bzw. auf meinem Server beim Provider irgendwas > 4.1)
gruß,
wahsaga
--
/voodoo.css:
#GeorgeWBush { position:absolute; bottom:-6ft; }