Highscoreliste mit Anzeige des Aktuellen Users "on Top"

Orakel

Erfahrenes Mitglied
MySQL: Highscoreliste mit Anzeige des Aktuellen Users "on Top"

Hallo zusammen,

Also ich hab schon versucht mittels der Suchfunktion was zu finden, war aber leider nicht erfolgreich.

Ich möchte eine Highscoreliste erstellen, bei der die Werte des aktuellen Benutzers on Top angezeigt werden. Das Problem liegt daran, dass die Liste nach verschiedenen Spalten sortiert werden kann, und trotz unterschiedlicher Sortierung der Rang des aktuellen Benutzers entsprechend der gewählten Sortierung korrekt und immer an erster Stelle dargestellt werden soll.

Beispiel:
- Die Tabelle hat die Spalten Name, Level, gewonnen, verloren
- Nach jeder Spalte kann auf- und absteigend sortiert werden
- Es werden immer nur 100 Einträge aus der Tabelle angezeigt
- DB = MySQL
- Der aktuelle Rang wird nicht in der Tabelle gespeichert

Um die Liste mit 100 Einträgen anzuzeigen benutze ich ein einfaches SQL Statement (hier mal Metacode)

SELECT {Felder}
FROM {Tabelle}
ORDER BY {Sortierkriterium}
LIMIT {X}, 100

{X} ist abhängig von der aktuellen Seitenzahl

Der aktuelle Rang wird dann innerhalb des Scriptes anhand der aktuellen Seite errechnet.

Ist es möglich das SQL-Statement so zu erweitern, dass die erste Row die Daten des aktuellen Benutzers enthält, auch wenn die aktuell angezeigte Seite den Benutzer gar nicht auflisten würde, weil er nicht in diesem Rangrange liegt?


Danke für Eure Mühe
 
Zuletzt bearbeitet:
Hi Gumbo,

danke für die schnelle Hilfe. *ggg* Darauf hätte ich auch selber kommen können. Das löst zumindest das Problem, dass der Datensatz des aktuellen Users an erster Stelle steht.

Nur den dazugehörigen Rang in der aktuellen Sortierung habe ich leider nicht. Wie gesagt in keiner der Tabellen wird ein Rang gespeichert. Müste also durch das SQL-Statement ermittelt werden, je nachdem wie die Sortierung und Selektierung aussieht. Vielleicht geht's ja auch überhaupt nicht, und ich muss wirklich den Weg gehen den aktuellen Rang permanent beim Update entsprechend relevanter Werte neu zu ermitteln und in die Tabelle zurück zu schreiben. (Aber genau das wollte ich nicht)

Eine Frage zum UNION. Die Sortierung des zweiten SELECT haut nicht hin. Hier mal das Beispiel SQL-Statement

Code:
(
  SELECT u.user_id, u.user_login, v.user_level 
  FROM user_base u
  INNER JOIN user_values v ON v.user_id = u.user_id
  WHERE u.user_id = 10
)
UNION
(
  SELECT u.user_id, u.user_login, v.user_level
  FROM user_base u
  INNER JOIN user_values v ON v.user_id = u.user_id
  WHERE u.user_id != 10
  ORDER BY v.skill_level
) LIMIT 1000, 100

Die Abfrage wird so ohne Fehlermeldung ausgeführt, aber der zweite SELECT ist nicht sortiert
 
Hallo,

das ginge auch anders:

SQL:
mysql> select * from highscore;
+--------+-------+
| userid | score |
+--------+-------+
|      1 |   200 |
|      2 |  3400 |
|      3 |   500 |
|      4 |  7800 |
|      5 |  1200 |
+--------+-------+
5 rows in set (0.00 sec)

SQL:
mysql> select * from highscore order by score desc;
+--------+-------+
| userid | score |
+--------+-------+
|      4 |  7800 |
|      2 |  3400 |
|      5 |  1200 |
|      3 |   500 |
|      1 |   200 |
+--------+-------+
5 rows in set (0.00 sec)

SQL:
mysql> select userid, score, case userid when 5 then 1 else 0 end as pseudo_sort_criteria from highscore order by pseudo_sort_criteria desc ,score desc;
+--------+-------+----------------------+
| userid | score | pseudo_sort_criteria |
+--------+-------+----------------------+
|      5 |  1200 |                    1 |
|      4 |  7800 |                    0 |
|      2 |  3400 |                    0 |
|      3 |   500 |                    0 |
|      1 |   200 |                    0 |
+--------+-------+----------------------+

oder so:
SQL:
mysql> select userid, score from highscore order by case userid when 5 then 1 else 0 end desc ,score desc;
+--------+-------+
| userid | score |
+--------+-------+
|      5 |  1200 |
|      4 |  7800 |
|      2 |  3400 |
|      3 |   500 |
|      1 |   200 |
+--------+-------+
5 rows in set (0.00 sec)

....wobei bei case userid when 5 die 5 die userid unseres aktuellen Users ist.


Gruß Tom
 
Funzelt einwandfrei Danke noch mal. Ich hab auch den Eindruck, dass Variante zwei etwas performanter ist.

Noch ne abschließende Frage. Wie bekomme ich nun den Rang des Users hin

Das sollte so aussehen:

Code:
Rang       Name                 Gewonnen
787        aktueller User         20

100        User 1                 40
101        User 2                 40
102        User 4                 40
...
...
199        User x                 38

Wie gesagt der Rang wird nicht in der DB gespeichert. Er sollte durch die Sortierung ermittelt werden.
 
Hallo!

... das scheint unter MySQL etwas komplizierter zu sein:
SQL:
mysql> set @rownum = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT (
    -> select a.ranking from (select userid, @rownum:=@rownum + 1 as ranking from highscore ORDER BY score Desc) a where a.userid = h.userid) as ranking,
    -> h.userid,
    -> h.score
    -> FROM highscore h ORDER BY case userid when 5 then 1 else 0 end DESC ,score DESC;
+---------+--------+-------+
| ranking | userid | score |
+---------+--------+-------+
|       3 |      5 |  1200 |
|       1 |      4 |  7800 |
|       2 |      2 |  3400 |
|       4 |      3 |   500 |
|       5 |      1 |   200 |
+---------+--------+-------+
5 rows in set (0.00 sec)

Gruß Tom
 

Neue Beiträge

Zurück