Ich habe zwei Highscoretabellen "scores_old" und "scores".
Bildschirmfoto 2010-08-23 um 15.00.34.jpg
Es soll geschaut werden, welcher Nutzer der Tabelle "scores_old" in Tabelle "scores" ein Rank verloren hat, oder gar ganz herausgefallen ist.
Beide Tabellen sind komplett gleich aufgebaut.
Derzeit löse ich es mit einer WHILE Schleife, die jeden einzelnen Eintrag aus der "scores_old" holt und dann in der "score_new" schaut, ob der Rank darin schlechter ist, oder der Spieler ganz herausgefallen ist.
Leider fallen dabei fast 12.000 SQL-Abfragen in dieser WHILE-Schleife an. Was das Script langsam macht und den Server auslastet.
Hat jeder einen Stichwort, wie man sowas Resourcenschonender berwerkstelligen könnte. Würde es sich mit zwei verschachtelte SQL-Abftagen schneller und leichter lösen lassen?
edit: Fast geschafft:
Damit gebe ich nun die Rank-Veränderung aus. Allerdings glaube ich, dass dort immer noch ein Denkfehler in der Abfrage ist, und mit der Abfrage zuviel abgefragt wird. Dieses Statement benötigt aber immer noch länger als eine Minute, um das Ergebniss zu liefern.
Was bei diese Lösung auch nicht funktioniert ist die Erkenung, wenn ein Spieler gar nicht mehr in der neuen Highscoreliste auftaucht. Er hat somit soviele Ranks verloren, dass er nicht mehr gelistet wird. Das erkennt dieses Statement aber nicht. Das funktkoniert nur bei Spielern, die einen Eintrag in der alten und neuen Highscoretabelle haben.
Bildschirmfoto 2010-08-23 um 15.00.34.jpg
Es soll geschaut werden, welcher Nutzer der Tabelle "scores_old" in Tabelle "scores" ein Rank verloren hat, oder gar ganz herausgefallen ist.
Beide Tabellen sind komplett gleich aufgebaut.
Derzeit löse ich es mit einer WHILE Schleife, die jeden einzelnen Eintrag aus der "scores_old" holt und dann in der "score_new" schaut, ob der Rank darin schlechter ist, oder der Spieler ganz herausgefallen ist.
Leider fallen dabei fast 12.000 SQL-Abfragen in dieser WHILE-Schleife an. Was das Script langsam macht und den Server auslastet.
Hat jeder einen Stichwort, wie man sowas Resourcenschonender berwerkstelligen könnte. Würde es sich mit zwei verschachtelte SQL-Abftagen schneller und leichter lösen lassen?
edit: Fast geschafft:
Code:
SELECT o.foreign_key, o.level, o.username, o.rank AS rankold, n.rank AS ranknew FROM scores_old o, scores n WHERE (o.foreign_key LIKE n.foreign_key) AND o.level LIKE n.level AND o.username LIKE n.username AND n.rank > o.rank
Zeige Datensätze 0 - 7 (8 insgesamt, die Abfrage dauerte 56.2258 sek.)
Kommentar