MySQL Tabellen sortieren.

Cury

Aktives Mitglied
Hey,
Ich habe mir eine MySQL Tabelle angelegt mit 3 Spalten (UUID, Spielername, Punkte). Ich möchte jetzt die Punkte in einer Methode nach der Größe sortieren. Der größte wert oben, dann immer abnehmend. Wie kann man dies schaffen?
Mein Ziel ist dann, dass man im Spiel /stats machen kann und dann sehen kann welcher Platz man ist. Also der der die meisten Punkte hat ist Platz 1 usw..
Z.B. macht man /stats und dann steht dort: Deine Platzierung: 1
 
Du könntest eine verschachtelte Abfrage machen, erst eine Abfrage auf den Spielernamen, also sowas
- Selektiere die Punkte des Eintrags mit dem aktuellen Spielernamen
- nehme die Punkte vom gefundenen Eintrag und zähle die Einträge n mit mehr Punkten
--> Deine Platzierung ist n + 1
 
Falls Deine Tabelle tab heißt:
SQL:
SELECT * FROM 
  (SELECT @r := @r+1 as pos, tab.* FROM tab, (SELECT @r := 1) tmp ORDER BY Punkte DESC) t
WHERE UUID = :uuid
 
wenn die Tabelle jetzt Punkte heißt:

public static int ranking(UUID uuid) {
try (PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT * FROM (SELECT @r := @r+1 as pos, punkte.* FROM punkte, (SELECT @r := 1) tmp ORDER BY Punkte DESC) WHERE `UUID` := uuid")) {
ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return -1;
}
 
Zuletzt bearbeitet:
Da gibt es aber einen Fehler:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE `UUID` := uuid' at line 1

at sun.reflect.GeneratedConstructorAccessor113.newInstance(Unknown Source)
[16:34:48 WARN]: at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
[16:34:48 WARN]: at java.lang.reflect.Constructor.newInstance(Unknown Source)
[16:34:48 WARN]: at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
[16:34:48 WARN]: at com.mysql.jdbc.Util.getInstance(Util.java:382)
[16:34:48 WARN]: at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
[16:34:48 WARN]: at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)
[16:34:48 WARN]: at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
[16:34:48 WARN]: at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
[16:34:48 WARN]: at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
[16:34:48 WARN]: at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
[16:34:48 WARN]: at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
[16:34:48 WARN]: at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2273)
[16:34:48 WARN]: at me.bluenitrox.stats.Kills.ranking(Kills.java:78)
[16:34:48 WARN]: at me.bluenitrox.commands.stats_Command.onCommand(stats_Command.java:26)
[16:34:48 WARN]: at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[16:34:48 WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[16:34:48 WARN]: at org.bukkit.craftbukkit.v1_8_R1.CraftServer.dispatchCommand(CraftServer.java:646)
[16:34:48 WARN]: at net.minecraft.server.v1_8_R1.PlayerConnection.handleCommand(PlayerConnection.java:1115)
[16:34:48 WARN]: at net.minecraft.server.v1_8_R1.PlayerConnection.a(PlayerConnection.java:950)
[16:34:48 WARN]: at net.minecraft.server.v1_8_R1.PacketPlayInChat.a(PacketPlayInChat.java:26)
[16:34:48 WARN]: at net.minecraft.server.v1_8_R1.PacketPlayInChat.a(PacketPlayInChat.java:53)
[16:34:48 WARN]: at net.minecraft.server.v1_8_R1.PacketHandleTask.run(SourceFile:13)
[16:34:48 WARN]: at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[16:34:48 WARN]: at java.util.concurrent.FutureTask.run(Unknown Source)
[16:34:48 WARN]: at net.minecraft.server.v1_8_R1.MinecraftServer.z(MinecraftServer.java:696)
[16:34:48 WARN]: at net.minecraft.server.v1_8_R1.DedicatedServer.z(DedicatedServer.java:316)
[16:34:48 WARN]: at net.minecraft.server.v1_8_R1.MinecraftServer.y(MinecraftServer.java:634)
[16:34:48 WARN]: at net.minecraft.server.v1_8_R1.MinecraftServer.run(MinecraftServer.java:537)
[16:34:48 WARN]: at java.lang.Thread.run(Unknown Source)
 
Zuletzt bearbeitet:
Da gibt es aber einen Fehler:
Ja, weil Du = :uuid und nicht := uuid schreiben musst. Außerdem musst Du die UUID auch mitgeben (ps.setString("uuid", uuid.toString());), bevor Du die Abfrage ausführst. Und executeQuery bringt jetzt auch nicht viel, wenn Du den Rückgabewert (ResultSet) nicht weiter verarbeitest.
 
Also muss ich einfach machen:

public static int ranking(UUID uuid) {
try (PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT * FROM (SELECT @r := @r+1 as pos, punkte.* FROM punkte, (SELECT @r := 1) tmp ORDER BY Punkte DESC) WHERE `UUID` = :uuid")) {
ps.setString("uuid", uuid.toString);
ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}
return -1;
}
 
Nein, schreib halt mal richtig ab: toString() und nicht toString. Außerdem wird die Methode nach wie vor immer -1 zurückgeben, weil Du einfach nur die Abfrage ausführst aber mit dem Ergebnis der Abfrage nichts anfängst.
 
Wie wäre es, wenn du dir einfach einmal paar JDBC und SQL Tutorials anschauen würdest? Wenn man versteht, was man da macht, dann steigen die Erfolgsaussichten deutlich.
 
SELECT Spielername, Punkte,
rank() OVER (ORDER BY Punkte DESC) Rang,
dense_rank() OVER (ORDER BY Punkte DESC) DenseRang
FROM Punkttabelle;

Wenn man diese sql query nimmt. Wir mache ich dann weiter. Da wird ja nicht die UUID übergeben
 
Um was geht es Dir genau? Wenn Du ein Spiel selbst entwickeln willst, dann setzt das voraus, dass Du Dir die dafür notwendigen Dinge aneignest.

Wenn du das nicht willst, dann kannst du daraus verzichten: kauf einfach ein vorhandenes Spiel und spiel es. Oder kauf dir eine Software, wo du ohne Programmieren etwas zusammen klicken kannst.

Aber selbst bei letzterem musst du Dich intensiv damit beschäftigen und lernen, wie es funktioniert...

Gewisse Grundlagen sind auch gerade bei Datenbanken wichtig. Grundkenntnisse sollte man haben, sonst ist eine Enttäuschung vorprogrammiert....
 
Das ist sehr löblich, erwarte aber nicht, dass in 3 Std. alles erklärt wird 🙂 Ich würde sagen, nach einer Einführung von 3 Std. wirst Du einfache DML-Abfragen verstehen und schreiben können und die Grundlagen soweit kennen, dass Du Dir selbst komplexere Dinge erarbeiten kannst. Bei konkreten Verständnisfragen hilft Dir das Forum gerne.
 
In dem Tutorial wird die INSERT INTO, UPDATE, NULL WERTE, SCHLÜSSEL, DELETE, CREATE GROUP BY, ORDER BY, LIMIT, mathematische Operatoren, Daten Typen, spalten alias, WHERE erklärt.

Ich glaube das ist alles was ich für mein Problem brauche oder?
 
Ich habe jetzt einen Code erarbeitet. Allerdings ist da irgendwo ein Synatx Fehler, den ich nicht finden kann.

SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY Kills DESC) pos FROM kills) WHERE UUID = ?
 
Du musst dem Subselect (SELECT *, ROW_NUMBER() OVER (ORDER BY Kills DESC) pos FROM kills) einen Namen geben:
SQL:
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY Kills DESC) pos FROM kills) t WHERE UUID = ?
 
Wieso eigendlich dieses Subquery? Wieso nicht die Window Funktion um das Where erweitern?

SQL:
SELECT Spielername, Kills,
rank() OVER (ORDER BY Kills DESC) Rang,
dense_rank() OVER (ORDER BY Kills DESC) DenseRang
FROM kills WHERE UUID = ?;

Ich würde mir noch angewöhnen kein * zu nutzen sondern die abzufragenden Spalten anzugeben.
 

Neue Themen


Zurück
Oben