meine aktuelle Abfrage sieht in etwa so aus. Ich habe versucht, es zu optimieren, aber ich hatte bisher kein Glück. Mein Ziel ist es, für jeden Spieler den Unterschied in stat_value zwischen dem aktuellen Tag und dem vorherigen Tag zu erhalten und ihn dann zu bestellen. Der aktuelle Code funktioniert gut, fühlt sich aber für mich nicht optimiert an. Die? Werte werden mit Java gefüllt.MySQL Abfrage über mehrere Zeilen hinweg optimieren
SELECT t1.stat_value -
(SELECT stat_value
FROM leaderheadsplayersdata_daily t2
WHERE t2.player_id = t1.player_id
AND t2.day = ?
AND t2.stat_type = ?
LIMIT 1
) as sum
, (SELECT name
FROM leaderheadsplayers
WHERE leaderheadsplayers.player_id = t1.player_id
LIMIT 1
)
FROM leaderheadsplayersdata_daily t1
WHERE day = ?
AND stat_type = ?
ORDER
BY sum DESC LIMIT 100
Tabellenstruktur:
Dies ist die Haupttabelle, die die Spieler-ID und Benutzername enthält.
CREATE TABLE IF NOT EXISTS `leaderheadsplayers`
(player_id INTEGER PRIMARY KEY AUTO_INCREMENT
,uuid VARCHAR(36) NOT NULL UNIQUE
,name VARCHAR(16) NOT NULL
,last_join DATETIME
) ENGINE = InnoDB
Dies ist die Tabelle mit den täglichen Daten.
CREATE TABLE IF NOT EXISTS leaderheadsplayersdata_daily
(player_id INTEGER NOT NULL
,stat_value DOUBLE NOT NULL
,stat_type VARCHAR(16) NOT NULL
,day INTEGER NOT NULL
,FOREIGN KEY (player_id) REFERENCES leaderheadsplayers(player_id) ON DELETE CASCADE
,PRIMARY KEY(player_id, stat_type, day)
) ENGINE = InnoDB
Vielen Dank im Voraus
Beschreibung Ihrer Tabellenstruktur würde helfen, eine Antwort vorzuschlagen – evilpenguin
Datenbankstruktur hinzugefügt. –
Können Sie die Ausgabe von EXPLAIN für Ihre Abfrage bereitstellen? – ultrajohn