Forum: PC-Programmierung MySQL Rang eines Listenelements bestimmen


von D. I. (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Was meinst du mit Rang?

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, lost ASC, draw ASC, user_id ASC;

Ähnliche Frage: http://forums.mysql.com/read.php?20,192721,235791

von D. I. (Gast)


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

von D. I. (Gast)


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

von D. I. (Gast)


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 = '...';

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Hast du dir auch im QUeryplan angeschaut dass das performanter ist?
In den allermeisten Fällen ist es vermutlich eh einfacher den "Platz" 
einfach bei der Ausgabe dranzuhängen.

von D. I. (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.