MYSQL: Alle einträge, die grösser sind als andere Eintrag
AllesMeins
- datenbank
Hiho,
ich bin ja gerade dabei festzustellen das mit mySQL viel mehr geht als ich bisher gedacht habe :) Naja, mal schauen ob das auch geht:
Ich habe in einer Tabelle einen Usernamen und die Punkte. Nun möchte ich gerne am einfachsten feststellen auf welchem Platz der Benutzer mit dem Namen "xxx" ist. Also irgendwie
SELECT COUNT(*) ALLES WO PUNKTE GRÖSSER IST ALS PUNKTE VON xxx
Oder so :)
Könnt ihr mir nen Tip(p) geben?
Grüsse
Marc
Hi ho,
mit Sub-Select wäre es spielend leicht, aber geht auch so glaub.
Sicherlich kann man das auch in MySQL mit einer Query lösen, aber im Moment bin ich grad etwas faul :-)
Mach zwei Queries und gut ist
Punkte von User auswählen
und dann von resultade auswählen wie viele mher haben.
Uli
Halihallo AllesMeins
ich bin ja gerade dabei festzustellen das mit mySQL viel mehr geht als ich bisher gedacht habe :)
Freilich :-)
Ich habe in einer Tabelle einen Usernamen und die Punkte. Nun möchte ich gerne am einfachsten feststellen auf welchem Platz der Benutzer mit dem Namen "xxx" ist. Also irgendwie
SELECT COUNT(*) ALLES WO PUNKTE GRÖSSER IST ALS PUNKTE VON xxx
Die Idee ist gut. Wie Ulrich bereits feststellt: Mit Subselects geht
dies vergleichsweise einfacher, nur, dass diese erst ab MySQL>4.x
unterstützt sind.
Bei MySQL<4.x könnte es schematisch wie folgt gehen:
SELECT
t1.name AS Name,
COUNT(*) AS Rang
FROM
table AS t1,
table AS t2
WHERE
t1.punkte<=t2.punkte
GROUP BY
t1.id
ORDER BY
Rang DESC
Ungetestet, aber so in der Art zumindest...
Nun, es gibt hier ein Problem: Falls es namen gibt, die dieselbe
Punktzahl erreichten, werden sie unweigerlich auch denselben Rang
erhalten.
Falls es gleiche Punktzahlen gibt, aber dennoch der "richtige, also
streng wachsende" Rang ausgegeben werden soll, könntest du dir
folgendem (nicht sehr SQL-ischen) Trick behelfen:
SET @rang := 0;
SELECT
name AS 'Name',
@rang := @rang + 1 AS 'Rang'
FROM
table
ORDER BY
punkte DESC
Naja, lies auf jeden Fall:
http://dev.mysql.com/doc/mysql/en/Variables.html, denn es
gibt einige Einschränkungen, besonders bei GROUP BY, HAVING, ORDER
BY und Konsorten (obwohl der Query von oben dürfte funktionieren).
Es ist auch nicht wirklich "schönes SQL", dafür sau viel schneller
als ein Fulljoin über zweimal dieselbe Tabelle.
Viele Grüsse
Philipp
Hiho,
hmm, ich glaube ich habe mich nicht ganz präzise ausgedrückt. Mir geht es nicht darum allen Usern einen Rang zuzuordnen (was zwar schön zu wissen ist generell aber mit PHP einfacher gehen dürfte, wenn ich sowieso nur eines auslese), sondern nur für den user 'xxx' zurück zu bekommen "7" oder sowas. Deine beiden Querys funktionieren zwar spitze, geben mir aber jeweils alle User zurück und dann kann ich auch einfach beim auslesen PHP mitzählen lassen. Aber gerade das wollte ich vermeiden.
Grüsse
Marc
Halihallo AllesMeins
hmm, ich glaube ich habe mich nicht ganz präzise ausgedrückt.
Ich glaube, ich habe nicht gründlich gelesen :-)
Mir geht es nicht darum allen Usern einen Rang zuzuordnen (was zwar schön zu wissen ist generell aber mit PHP einfacher gehen dürfte, wenn ich sowieso nur eines auslese), sondern nur für den user 'xxx' zurück zu bekommen "7" oder sowas. Deine beiden Querys funktionieren zwar spitze, geben mir aber jeweils alle User zurück und dann kann ich auch einfach beim auslesen PHP mitzählen lassen. Aber gerade das wollte ich vermeiden.
Richtig. Nun, wie wäre es, wenn du in meinem *ersten* Vorschlag (der
zweite taugt nicht für diese Aufgabenstellung, s. Link) einfach nach
t1.name (oder t1.id) selektierst? - Einfach t1.name='xxx' in die
WHERE-Klausel schreiben, oder t1.id='yyy' in einer wahlweise HAVING-
oder WHERE-Klausel. So einfach :-)
Viele Grüsse
Philipp
Hiho,
Ich glaube, ich habe nicht gründlich gelesen :-)
Das wra natürlich auch mein erster Verdacht, aber man ist ja höflich und geht erst mal davon aus das der Grund auf meiner Seite liegt...
Naja, deine Lösung hat funktioniert - vielen Dank dafür
Marc