AllesMeins: MYSQL: Alle einträge, die grösser sind als andere Eintrag

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

  1. 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

  2. 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

    --
    M$: Patches - don't.
    1. 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

      1. 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

        --
        M$: Patches - don't.
        1. 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