| 

.NET C# Java Javascript Exception

2
Ich hab in einer MySql-Datenbank eine VIEW mit dem Namen ranking, die über mehrere Tabellen hinweg mathematische Berechnungen durchführt. Das Ergebnis sieht dann ungefähr so aus:
-----------------
| user 5 | 7228 |
| user 8 | 9365 |
| user 1 | 2105 |
| user 2 | 2591 |
| user 6 | 4312 |
-----------------

Jetzt sollen diese Zahlen in einem Ranking enden, sprich das Ergebnis soll den Rang enthalten und nach Punkten sortiert sein.
Ich hab dann rausgefunden, daß man mittels
SELECT @num:=@num + 1 AS uid, user, points FROM (SELECT @num:=0) r, ranking ORDER BY points

folgendes erhält, was ziemlich genau das ist, was ich haben wollte:
-----------------
| 1 | user 8 | 9365 |
| 2 | user 5 | 7228 |
| 3 | user 6 | 4312 |
| 4 | user 2 | 2591 |
| 5 | user 1 | 2105 |
-----------------

Das eigentliche Problem ist jetzt, daß ich wissen muß, an welcher Position sich ein bestimmter User befindet und das bevor die Liste ausgegeben wird. Also entweder ich durchsuche die Rückgabe des SELECTs, was aber ab einer gewissen Anzahl User ziemlich viel Zeit und Performance kostet, oder ich schaffe es irgendwie MySql dazu zu bringen, mir die Position zu ermitteln. Ein einfaches WHERE in die SELECT-Abfrage einzufügen bringt nichts, da der Parameter @num nur auf das Ergebnis angewendet wird, wodurch der gesuchte User immer Rang 1 hat, da es nur 1 Treffer gibt. In der VIEW selber kann ich meines Wissens nach auch keine fortlaufende Nummer erzeugen, zumindest nicht über das @num Konstrukt, da Parameter in einer VIEW nicht erlaubt sind. Möglicherweise geht das über eine STORED PROCEDURE, die zuerst die VIEW mit der fortlaufenden Nummer versieht und dann ein bestimmtes SELECT über das Ergebnis jagt, aber dazu hab ich bislang nichts gefunden im Netz.

Daher die Frage: Hat irgendwer eine Ahnung, wie man zu einer VIEW eine fortlaufende Nummer hinzufügen kann und zwar so, daß man diese möglichst über eine einfache SELECT-Abfrage ermitteln kann?
21.10.2012
lunatigs 1,3k 2 8
1 Antwort
1
Beim MS-SQLServer geht dies über einen Self-Join.

select rank=count(*), a1.name, a1.value
from ranking a1, ranking a2
where a1.value >= a2.value
group by a1.name, a1.value
having a1.name='user 5'
order by rank

Kann nur gerade leider nicht nachprüfen, ob die Zuweisung auch auf MySQL übertragbar ist.

| 1 | user 4  |   400 |
| 2 | user 6 | 333 |
| 3 | user 2 | 200 |
| 4 | user 1 | 100 |
| 5 | user 5 | 80 |


Mit den having Ausdrücken gelangt man nun an die entsprechende Zeile aus der View:
having a1.name='user 5' --> Infos zu User 5
having count(*)=2 --> Infos zu dem Zweitplatzierten
21.10.2012
mithos 26 1
Danke! Es bedurfte zwar noch kleiner Änderungen, aber das Ergebnis funktioniert erschreckend gut. SELECT count(*) AS rank, a1.user, a1.points FROM ranking AS a1, ranking AS a2 WHERE a1.points <= a2.points GROUP BY a1.points, a1.user HAVING a1.user = 'user 5' ORDER BY rank (wobei das ORDER BY rank scheinbar gar keine Auswirkungen hat, aber ich hab es mal drin gelassen).
lunatigs 22.10.2012

Stelle deine Mysql-Frage jetzt!