MySQL aktuellster Eintrag mit Bedingung
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfragen
aktuellen datum
all
benutzer
code
dank
datum
eintrag
endzeit
job
limit
mache
sekunde
spalten
spieler
stunden
tabelle
url
zeitpunkt
zugeordnete zahl
-
Hallo,
ich habe für ein Browsergame eine Tabelle mit den Jobs, die ein Spieler ausführt. Die Tabelle sieht in etwa so aus:
spielerjobs:
BenutzerJobID | BenutzerID | JobID | Endzeit 1 | 5 | 3 | 1355000000 2 | 4 | 5 | 1355000952 3 | 7 | 11 | 1355051145 4 | 9 | 1 | 1355090236 5 | 9 | 5 | 1355920584
Erklärung:
BenutzerJobID = ID, die hochzählt, egal welcher Benutzer welchen Job strartet
BenutzerID = ID des Benutzers
JobID = Nummer des jeweiligen Jobs
Endzeit = Timestamo, der angibt, wann der Job beendet ist
Beispielszenario:
Benutzer Nr. 3 startet einen Job, der 2 Stunden (7200 Sekunden) dauert. Dieser Timer darf allerdings nicht einfach zu dem aktuellen Datum addiert werden, sondern wenn noch ein Job läuft, müssen die 7200 Sekunden zu der Zahl der Sekunden addiert werden, die die aktuellste ist, also so:
Benutzer Nr. 3 ist wieder "arbeitslos" um 1355051145 (siehe Tabelle oben). Wenn dieses Datum bereits abgelaufen ist und der Spieler einen neuen Auftrag erteilt, muss ein neuer Eintrag erstellt werden, der dann bei "Endzeit" den Timestamp (
) + 7200 stehen hat. Wenn dieses Datum noch nicht abgelaufen ist, dann muss der AKTUELLSTE Eintrag aus der Tabelle entnommen werden und zu ihm müssen dann die 7200 Sekunden addiert werden.time();
Dazu kommt noch, dass ich nur eine Bestimmte Anzahl an Jobs möglich machen können möchte, also nur beispielsweise 5 Einträge, die über dem aktuellen Datum liegen, die davor müssen vernachlässigt werden.
Wie mache ich das am besten?
Ich hoffe es ist einigermaßen verständlich, danke für alle Antworten
MFG THWBM -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo all-in1, danke für deine Antwort
all-in1 schrieb:
DESC LIMIT 0,1
Dann erhälst du den höchsten Eintrag.
Das andere kannst du leicht abfragen mit mysql_num_rows.
Ich habe Stunden versucht und rummprobiert, dann stelle ich eine Frage hier im Forum und du beantwortest sie in drei halbvollen Zeilen. Das ist deprimierend . Es fuktioniert jetzt soweit alles, wenn nochwas falsch läuft, melde ich mich wieder.
Danke
Für Leute die es interessiert:
$AbfrageSpielerJob1 = "SELECT * FROM spielerjobs WHERE BenutzerID = '$BenutzerID' AND Endzeit > '$Zeitpunkt' ORDER BY BenutzerJobID DESC LIMIT 0,1"; $ErgebnisSpielerJob1 = mysql_query($AbfrageSpielerJob1); while($RowSpielerJob1 = mysql_fetch_object($ErgebnisSpielerJob1)) { //mache etwas }
In der while-Schleife kann ich jetzt informatinen zum aktuellsten Eintrag des jeweiligen Spielers abfragen.
$AbfrageJobAnzahl = "SELECT * FROM spielerjobs WHERE BenutzerID = '$BenutzerID' AND ENDZEIT > '$Zeitpunkt'"; $ErgebnisJobAnzahl = mysql_query($AbfrageJobAnzahl); $JobAnzahl = mysql_num_rows($ErgebnisJobAnzahl)
ist die Anzahl an Jobs, die ein Spieler zur Zeit ausführt.$JobAnzahl
MFG THWBM -
Manchmal gehts es halt doch einfacher als man glaubt.
Was mich freut, ist dass du es dann mit meinen Stichworten dennoch geschafft hast. -
So wie ich das verstehe sind die Spalten JobID und Endzeit abhängig von einander, als auch BenutzerJobID und BenutzerID. Dadurch hast du eine Tabelle in 1. Normalform, was dir erhebliche Annomalien verursachen kann..
Du solltest das aufteilen und in mehrere Tabellen splitten, hier wird ziemlich gut erklärt warum und wie das geht:
>> Klick me << -
kill-a-teddy schrieb:
So wie ich das verstehe sind die Spalten JobID und Endzeit abhängig von einander, als auch BenutzerJobID und BenutzerID.
Hallo,
entweder du hast mich falsch verstanden oder ich habe dich falsch verstanden.
BenutzerJobID:
Ein X belibiger Spieler startet eine X belibige Arbeit, der Wert wird mit AUTO_INCREMENT festgelegt.
BenutzerID:
Eindeutige einem Spieler zugeordnete Zahl
JobID
Eindeutige einem bestimmten Job zugeordnete Zahl
Endzeit:
Timestamp, der in dem Moment generiert wurde, als der Job gestartet wurde.
Wer hat jetzt wen falsch verstanden?
MFG THWBM -
So mal auf die Schnelle:
/* Prüfung ob ein Spieler 3 mehr als aktuelle 5 Jobs hat. */ SELECT BenutzerJobID FROM spielerjobs WHERE BenutzerID = 3 AND Endzeit >= UNIX_TIMESTAMP()
Wenn du < 5 findest machst du weiter, da er Spieler einen weiteren Job anlegen darf. Du lässt den höchsten Wert der Endzeit ausgeben, damit du auf diesem Wert die neue Dauer draufrechnen kannst..
/* Endzeit des aktuellsten Jobs von Spieler 3 oder Timestamp */ SELECT Endzeit, MaximaleEndzeit = ( CASE WHEN Endzeit < UNIX_TIMESTAMP() THEN UNIX_TIMESTAMP() ELSE Endzeit END ) FROM spielerjobs WHERE BenutzerID = 3 ORDER BY Endzeit DESC LIMIT 0,1
Somit verwendest du immer die aktuellste Zeit, entweder die vom aktuellsten Job oder die jetztige.
Beitrag zuletzt geändert: 18.12.2012 21:02:36 von bdsg -
bdsg schrieb:
So mal auf die Schnelle:
/* Prüfung ob ein Spieler 3 mehr als aktuelle 5 Jobs hat. */ SELECT BenutzerJobID FROM spielerjobs WHERE BenutzerID = 3 AND Endzeit >= UNIX_TIMESTAMP()
Wenn du < 5 findest machst du weiter, da er Spieler einen weiteren Job anlegen darf. Du lässt den höchsten Wert der Endzeit ausgeben, damit du auf diesem Wert die neue Dauer draufrechnen kannst..
/* Endzeit des aktuellsten Jobs von Spieler 3 oder Timestamp */ SELECT Endzeit, MaximaleEndzeit = ( CASE WHEN Endzeit < UNIX_TIMESTAMP() THEN UNIX_TIMESTAMP() ELSE Endzeit END ) FROM spielerjobs WHERE BenutzerID = 3 ORDER BY Endzeit DESC LIMIT 0,1
Somit verwendest du immer die aktuellste Zeit, entweder die vom aktuellsten Job oder die jetztige.
Hallo,
ich habe mir das so ähnlich bereits selber zusammengebaut, aber es ging sich jetzt eher um die Aussage von kill-a-teddy:
kill-a-teddy schrieb:
So wie ich das verstehe sind die Spalten JobID und Endzeit abhängig von einander, als auch BenutzerJobID und BenutzerID. Dadurch hast du eine Tabelle in 1. Normalform, was dir erhebliche Annomalien verursachen kann..
Du solltest das aufteilen und in mehrere Tabellen splitten, hier wird ziemlich gut erklärt warum und wie das geht:
>> Klick me <<
Da ist noch irgendwo ein Widerspruch, entweder in meinem oder in seinem Kopf
MFG THWBM -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage