Position ermitteln
Folgende Situation: ich habe eine kleine Telefondatenbank, d.h. eine Tabelle mit Namen und Rufnummern. Gegeben sei nun der Name Fritz (zur Vereinfachung: der Name ist eindeutig). Ich möchte wissen, an welcher Position er steht, wenn ich die Liste nach Namen sortiere. Im mysql-Handbuch bin ich nicht fündig geworden.
Bisherige Kommentare (5)
Kommentar von Garvin
Probier mal:
SET @counter:=0;
SELECT @counter=:(@counter+1), nachname FROM telefonbuch;
Und daran denken, dass wenn Du die Query mehrfach absetzt, du vorher den Counter immer wieder auf 0 setzen musst.
(Getested mit MySQL 4.0.13 — wie SQL-portabel so eine Lösung ist, möchte ich nicht beurteilen ;-)
Kommentar von Martin Ringehahn
Um strings in eine Reihenfolge zu bringen muss mysql sie doch bestimmt in irgendeine Metrik zwingen. Kann man sich die nicht irgendwie zunutze machen um dann eine Abfrage aehnlich zu der:
select count(*) from telefonbuch where name < 'Schulz';
zu gestalten?
Kommentar von René
also bisher hatte ich es erst einmal notdürftig programmiert — und zähle die Ergebnisse durch.
Beide Varianten gefallen mir ...
Kommentar von Tomek
Es würde auch mit verschatelten Abfragen funktionieren (nicht getestet):
select count(*) from (select name from telefonbuch where name <= 'Fritz')
D.h. sortiere das Telefonbuch und gibt alles bis zum Fritz in eine temporäre Tabelle, deren Ausgabe einfach durchgezählt wird.
Kommentar von Thiemo
Das kommt mir verdammt bekannt vor: Das selbe Problem hatte ich in eine Datenbanken-Klausur eingebaut. Bei mir ging es um Wettkampfergebnisse, wobei ich aus der erzielten Zeit die Platzierung ermitteln möchte. Meine Lösung ist ein (Standard-konformes) Self-JOIN:
SELECT t.nachname, COUNT(kleinere.nachname) + 1 AS position
FROM telefonbuch AS t
LEFT OUTER JOIN telefonbuch AS kleinere
ON t.nachname > kleinere.nachname
GROUP BY t.nachname
ORDER BY t.nachname;
Mit einem Sub-SELECT lässt sich eine äquivalente Lösung konstruieren. Der Self-JOIN ist allerdings cooler. ;-)
Kommentar verfassen
Bisherige Trackbacks (0)
Es wurde noch kein Trackback empfangen!