kostenloser Webspace werbefrei: lima-city


MySQL aktuellster Eintrag mit Bedingung

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    thwbm

    thwbm hat kostenlosen Webspace.

    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 (
    time();
    ) + 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.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. DESC LIMIT 0,1

    Dann erhälst du den höchsten Eintrag.

    Das andere kannst du leicht abfragen mit mysql_num_rows.
  4. Autor dieses Themas

    thwbm

    thwbm hat kostenlosen Webspace.

    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)

    $JobAnzahl
    ist die Anzahl an Jobs, die ein Spieler zur Zeit ausführt.

    MFG THWBM
  5. Manchmal gehts es halt doch einfacher als man glaubt.

    Was mich freut, ist dass du es dann mit meinen Stichworten dennoch geschafft hast.
  6. 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 <<
  7. Autor dieses Themas

    thwbm

    thwbm hat kostenlosen Webspace.

    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
  8. 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
  9. Autor dieses Themas

    thwbm

    thwbm hat kostenlosen Webspace.

    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
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!