MySQL Rang eines Listenelements bestimmen

Gast #2253530
Lesenswert?

Ich habe eine Liste die sich durch folgendes Statement ergibt:
1
SELECT * FROM stat ORDER BY won DESC, lost ASC, draw ASC, user_id ASC

Wie kann ich das Statement erweitern so dass ich den konkreten Rang in 
dieser Liste einer konkreten 'user_id' erhalte? user_id ist der 
Primärschlüssel.
Ich komme nicht drauf wie, bin mir aber relativ sicher dass sowas 
möglich ist ohne die ganze Liste durchzuiterieren.
Gast #2253559
Lesenswert?

Läubi .. schrieb:
> Was meinst du mit Rang?

Der wievielte Platz man in dieser Liste ist.

>
> hier:
> http://www.eggheadcafe.com/community/aspnet/13/10015707/row-id-in-mysql-50.aspx
> wird als Lösung vorgeschlagen:
>
1
SET @rownum :=0;
2
> SELECT @rownum := @rownum + 1 AS Rang, * FROM stat ORDER BY won DESC,
3
> lost ASC, draw ASC, user_id ASC;
>
> Ähnliche Frage: http://forums.mysql.com/read.php?20,192721,235791

Das wäre die Iterationslösung.

Ich meinte aber eher sowas wie

http://www.fachinformatiker.de/datenbanken/95143-mysql-rangplatz-rangliste-ermitteln.html#post890905

allerdings verstehe ich nicht wie ich das auf eine sortierte Liste wie 
meine anwende
Gast #2253583
Lesenswert?

Ok ich habs jetzt erstmal so gelöst:
1
SET @rownum :=0;
2

3
SELECT t.rang FROM (SELECT @rownum := @rownum + 1 AS rang, user_id FROM stat ORDER BY won DESC, lost ASC, draw ASC, user_id ASC) t WHERE t.user_id = '32';

Wenn jemand was besseres (== performanteres) für größere Datenmengen 
kennt, bin ich aber für Vorschläge offen
Gast #2253777
Lesenswert?

So jetzt hab ich ein Statement mithilfe von selfjoin rausgeknobelt:
1
SELECT 
2
  COUNT (s1.user_id) as rank
3
FROM
4
  stat s1, stat s2
5
WHERE 
6
  (s1.won < s2.won) OR
7
  (s1.won = s2.won AND s1.lost > s2.lost) OR
8
  (s1.won = s2.won AND s1.lost = s2.lost AND s1.draw > s2.draw) OR
9
  (s1.won = s2.won AND s1.lost = s2.lost AND s1.draw = s2.draw AND s1.user_id >= s2.user_id)
10
GROUP BY s1.user_id
11
HAVING s1.user_id = '...';
Gast #2255323
Lesenswert?

Läubi .. schrieb:
> Hast du dir auch im QUeryplan angeschaut dass das performanter ist?

Wo sieht man das nach?

> In den allermeisten Fällen ist es vermutlich eh einfacher den "Platz"
> einfach bei der Ausgabe dranzuhängen.

Ja so mache ich das auch für die ganze Rangliste.

Wenn mich aber nur ein konkretes Element interessiert, dachte ich geht 
das evtl. besser

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren