mmofacts.com

Punkte schnell berechnen

gepostet vor 18 Jahre, 4 Monate von Progralixx
Bei mir werden einmal pro Tick (Stunde) die Punkte der Spieler aktualisiert.
Die Punktzahl ist von verschiedenen Faktoren abhängig, ich habe allerdings im Moment nur Probleme mit den Gebäudepunkten:
Pro Gebäude und Stufe erhält der Spieler x Punkte.
Beispiel:
1. Gebäude: Waffenfabrik Stufe 3
2. Gebäude: Kaserne Stufe 6
3. Gebäude: Zitadelle Stufe 2
Punkte: (3+6+2) * x
Soweit alles klar. Nun zu meinem (Optimierungs-)Problem:
Die Gebäudedaten und die Spielerdaten sind in zwei verschienden Tabellen gespeichert.
Meine Lösung bisher war erst alle Gebäustufen eines Spielers zu laden und dann die neu berechneten Punkte zu speichern:

SELECT SpielerID FROM Spieler; {
$punkte=0;
SELECT Ausbaustufe FROM Gebäude WHERE Spieler = SpielerID;
$punkte += Ausbaustufe * x;
UPDATE Spieler SET Punkte = $punkte;
}
Das sollte mal als schematische Darstellung ausreichen.
Nun möchte ich das in einer einzigen Anfrage machen (Ich gehe hier davon aus, dass die Punktezahlen der Spieler standardmäßig 0 ist):

UPDATE Spieler, Gebäude SET Spieler.Punkte = Spieler.Punkte + (Gebäude.Stufe * x) WHERE SpielerID = Gebäude.Spieler;
Das funktioniert so natürlich nicht, weil ich so nur einen Datensatz aus der Gebäudetabelle lade. Wie stelle ich es nun an, dass er nicht nur EIN Gebäude aus der Gebäudetabelle lädt, sondern alle?
Wäre dankbar über jeden Hinweis.
gepostet vor 18 Jahre, 4 Monate von Klaus
Moin,
wenn du Subquery einsetzen kannst, solltest du diese verwenden.
In etwa so wie
UPDATE Spieler SET Punkte = (SELECT SUM(Stufe) FROM Gebäude WHERE SpielerID=foo) * x;

sollte funktionieren*. Allerdings stehen Subquerys erst ab MySQL 4.1* zur Verfügung.
* Alle Angaben ohne Gewähr.
gepostet vor 18 Jahre, 4 Monate von Progralixx
MySql Version 3.23 ist installiert. Funktioniert also leider nicht.
Wenn es keine andere Möglichkeit gibt, muss ich eben bei der alten Lösung bleiben...
gepostet vor 18 Jahre, 4 Monate von Xerxekyran
also mich hat immer verwundert, dass meine subselects bei mySQL nie geklappt haben.. auch bei der aktuell neuesten nicht.
das man um stored procedures in die db zu kloppen nicht den phpMyAdmin benutzen darf, hat auch erst mal nen weilchen gedauert O.o (ist aktuell als bugtracker bei denen drin)
gepostet vor 18 Jahre, 4 Monate von abuzeus
Du könntest auch für jeden Spieler einen Counter mitschleppen (vulgo Feld in der Datenbank), wie viele Gebäude er aktuell gebaut hat (bietet sich bei deinem Bepunktungssystem jedenfalls an).
Dann brauchst du nur noch diese Werte zu ordnen (und ggf. mit X multiplizieren), schon hast du die Punkte. Das soltle deutlich schneller und einfacher sein.
Der Preis: Du musst an anderer Stelle arbeiten, nämlich diesen Counter bei jedem Gebäudebau hochsetzen (und bei Verlusten wieder runtersetzen).
Du ersetzt dafür einen Query der Komplexität (Anzahl der Spieler * Anzahl der Gebäude) durch einen Query der Komplexität (Anzahl der Spieler) plus die Updatequerys. Musst abwägen, ob sich das lohnt...
gepostet vor 18 Jahre, 4 Monate von Klaus
Sowas lohnt sich sicher bei einer stündlichen aktualisierung.
gepostet vor 18 Jahre, 4 Monate von Progralixx
Ja ich denke das ist eine gute Idee. Schließlich wird ein Gebäude viel seltener ausgebaut, als man Rohstoffe bekommt.

Auf diese Diskussion antworten