[PHP/SQL] Rohstoffberechnung eines Browsergames ** erledigt **

strolch00

redraft.de
ID: 155297
L
21 April 2006
1.684
72
Hi @all,

ich bin gerade dabei ein Browsergame zu programmieren, nun stehe ich jedoch vor dem Problem meine Rohstoffe zu berechnen. Ich hoffe mal das meine db Strucktur nicht daran schuld ist, aber erstmal die Strucktur:
PHP:
*** entfernt ***

Ich da ich ein realitätsnahes Browsergame machen will verbrauchen die Gebäude auch Rohstoffe wenn Sie schon fertig sind zB Holz für das Hauptgebäude(für Reparaturen am Gebäude).

Jetzt brauche ich die Summe der Rohstoffe im Dorf welche verbraucht und welche produziert werden.(getrennt)

Dazu habe ich folgende Ansätze gehabt:
PHP:
*** entfernt ***
PHP:
*** entfernt ***

Beide Versionen sind nicht ganz fertig, aber sie funktionieren nichtmal im Ansatz so wie Sie sollen.

Jetzt hoffe ich das einer von euch mir nen Tip geben kann wie das gehen könnte, bzw. weiß ich nicht ob das mit dem MySQL Variablen gehen könnte(mit denen kenne ich mich gar nicht aus). Wie gesagt ich hoffe mal das meine DB Strucktur nicht total verquer ist.

Oben ist mein SQL Auszug.

Danke @all.
 
Zuletzt bearbeitet:
Du JOINst noch mit einer Tabelle C, wie ist denn der Aufbau von dieser Tabelle, bzw. was steht da drin ?

In der Tabelle BulidingData hast Du eine Spalte level. Was besagt die ?
Scheint ja Teil des Primärschlüssels zu sein.

formuliere mal in eigenen Worten, das in der Tabelle BuildingData drinsteht.

Nachdem Du immer
SUM(b.`iron` * b.`level`)
addierst, heisst da, dass das Gebäude pro Stufe immer gleich viel kostet/verbraucht ? ( Wenn ja, warum brauchst Du in BuildingDate den Level ? )


Wenn in der Tabelle building_data die Kosten pro Gebäude stehen, erhältst Du die Summe pro Dorf über:

SELECT SUM ( wood ) , SUM ( mud ) , SUM (iron ) ...

FROM building_data A
INNER JOIN
village_building_data B
ON B.building_id = A.ID
AND B.level = A.level

bzw USING ( id / level )

WHERE b.village_ID = ??? <-- die Dorf-ID
 
Zuletzt bearbeitet:
In der C Tabelle stehen sämtliche Rohstoffe die es im Spiel irgendwie gibt und das level ist das Gebäudelevel. Also die Ausbaustufe des Gebäudes.

*edit
Ja den Level brauche ich, die Gebäude brauchen nicht immer gleich viel Ich JOIN die Tabelle ja mit USING(`building_id`, `level`) ==> also der Gebäude id und dem Level des Gebäudes welches gerade im Dorf steht.

*edit 2
dann würde ich ja genau falsch herum JOINEN oder nicht. Ich brauche ja nicht die gesamte buildingData sondern nur die Gebäude die im Dorf sind. Und dann bin ich doch mit meiner Richtung besser dran oder. Und mein Problem ist die Trennung Verbrauch und Produktion.
 
Zuletzt bearbeitet:
um zu wissen, was die Gebäude (ver-)brauchen, musst Du die Ressourcentabelle aber nicht dazu joinen. Die daten brauchst Du zu dem Zeitpunkt nicht.

Bei der Summe brauchst Du nicht mit dem Level zu multiplizieren. Da korrekten Daten stehen ja schon in der building_data

// edit

FROM building_data A
INNER JOIN
village_building_data B

ist identisch mit
FROM village_building_data B
INNER JOIN
building_data A

wichtig ist dass Du als Where-Bedingung
WHERE B.village_id = ??
das gewünschte Dorf auswählst
 
Zuletzt bearbeitet:
Die materials Tabelle joine ich nur um die Label zu erhalten wie die heißen in den beiden Sprachen. Ich weiß es ist nicht das sauberste.

*edit mit dem Level multiplizieren haste recht ist ein Denkfehler meiner seits.
 
Die materials Tabelle joine ich nur um die Label zu erhalten wie die heißen in den beiden Sprachen. Ich weiß es ist nicht das sauberste.


das klappt so aber nicht !
( Du willst ja alles in einer Zeile - Du müsstest die materials-Tabelle für jeden Rohstoff extra dazujoinen )

Nimm dafür ein eigenes Statement
 
Zuletzt bearbeitet:
Die kreativität bei den Tabellennamen haut ein ja klatt um... a b c soll das ein Kopierschutz durch obfuscation sein?

Und wieso gruppierst du nach Gebäude wenn du den Rohstoff verbrauch des Dorfes haben willst? Macht es da nicht mehr sinn nach den Dörfern zu Gruppieren?

Und was soll das "(b.`cereal` * b.`level`)" du speicherst für jedes Level ein eigenen Datensatz, da brauchst du den verbrauch doch nicht extra aus dem Level berechnen.
 
Die kreativität bei den Tabellennamen haut ein ja klatt um... a b c soll das ein Kopierschutz durch obfuscation sein?

nein, das ist ein Korrelationsname. Der erspart es einem, bei jeder ( nicht eindeutigen) Spalte den kompletten Tabellen-Namen angeben zu müssen

Und wieso gruppierst du nach Gebäude wenn du den Rohstoff verbrauch des Dorfes haben willst? Macht es da nicht mehr sinn nach den Dörfern zu Gruppieren?

Wenn er nur den Verbrauch für *ein* Dorf berechnen will, braucht er überhaupt nicht zu gruppieren

Und was soll das "(b.`cereal` * b.`level`)" du speicherst für jedes Level ein eigenen Datensatz, da brauchst du den verbrauch doch nicht extra aus dem Level berechnen.

Stimmt, sh. Beitrag #4+5
 
nein, das ist ein Korrelationsname. Der erspart es einem, bei jeder ( nicht eindeutigen) Spalte den kompletten Tabellen-Namen angeben zu müssen

Mir ist durchaus klar um was es sich hierbei Handelt. Das war eine anspielung auf die sinnige vergabe der Namen. egal ob nun Alias oder Tabelle. Wenn in jedem Query a b c d usw. verwendet wird hat man am ende plötzlich solche schönen effekte wie das in dem einen Query buildingData a ist und im nächsten plötzlich c. Na Herzlichen glückwunsch kann ich dazu nur sagen...

Wenn er nur den Verbrauch für *ein* Dorf berechnen will, braucht er überhaupt nicht zu gruppieren

In der Form wie die Queries hier gepostet wurden muss er definitiv Gruppieren. Er leist schleißlich nicht alle Werte über eine Aggregatfunktion aus... (auch wenn der Wert in der Form überhaupt kein sinn macht)
 
So ihr habt ja beide Recht @Zero ich habe auch gesagt das ist nocht net die entgültige Form ;)

So hier nochmal mein aktueller Query:
PHP:
*** entfernt ***

Funktioniert super, perfekt wäre es wenn man den verbrauch und die Produktion getrennt summieren könnte. Gibt es da ne möglichkeit?
 
Zuletzt bearbeitet:
Den GROUP BY kannst Du Dir in der letzten Query sparen, weil Du sowieso nur eine Village_id hast.

Woran erkennst Du denn, ob Du produzierst oder verbrauchst ?
Nur am Vorzeichen in den einzelnen Spalten der Buildung_data ?


Wenn ja, kannst Du z.B. so trennen ( Wenn Verbrauch > 0, Produktion < 0 ):

SELECT
SUM(MAX(b.`wood`,0)) as Verbrauch_Holz ,
SUM(MIN(b.`wood`,0)) as Produktion_Holz ,
SUM(MAX(b.`mud`,0)) as Verbrauch_mud ,
SUM(MIN(b.`mud`,0)) as Produktion_mud ,
...
 
Zuletzt bearbeitet: