fritz85: SQL: time() faken :-)

Hallo..

Ich habe einen Cronjob und der aktualisiert mir jeden Tag je nach dem ab und zue 3 oder manchmal auch 10 Einträge. Da macht er ein Update auf den gewissen Datensatz und aktualisiert die Spalte: time neu. Dort ist der Timestamp drin (".time().").

Jedoch wenn nun 3 oder 10 Einträge gleichzeitig aktualisiert werden haben alle den gleichen Timestamp dies darf leider nicht der Fall sein.

Kann man das irgendwie umgehn das z.B. jeder Eintrag einen anderen Timestamp hat wie z.B. time()-1 (so wären Sie immerhin verschieden). Hat jemand einen Tipp?

Gruss
fritz85

  1. Hello,

    Kann man das irgendwie umgehn das z.B. jeder Eintrag einen anderen Timestamp hat wie z.B. time()-1 (so wären Sie immerhin verschieden). Hat jemand einen Tipp?

    nur einen Ratschlag: abhängig von der Art der Anwendung ist es eine saugefährliche Nummer einen Timestamp als Primärschlüssel zu verwenden. Je nach Systemlast, paralleler Verarbeitung, Clusterung oder sonstwas kann es durchaus relativ einfach vorkommen, dass zwei Sätze um exakt die selbe Zeit geschrieben werden.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Death is nature's way of telling you to slow down.
    1. Hello,

      nur einen Ratschlag: abhängig von der Art der Anwendung ist es eine saugefährliche Nummer einen Timestamp als Primärschlüssel zu verwenden. Je nach Systemlast, paralleler Verarbeitung, Clusterung oder sonstwas kann es durchaus relativ einfach vorkommen, dass zwei Sätze um exakt die selbe Zeit geschrieben werden.

      Danke für deine Besorgnis. :-)

      Jedoch hilft mir das nicht weiter ;)

      while ($row = mysql_fetch_array($result))
      {
      for($i = 0; $i <= $result_rows; $i++)
      {
          $time = time()+$i;
      }
      $query = "UPDATE XYZ SET time = '".$time."' WHERE id = '".$row['id']."'";
      }

      kommte mit dem irgendwie nicht ans Ziel habe 2 Ausgabe also ist $result_rows = 2; aber gibt mir gleichen Timestamp raus..? hmm

      1. Hallo

        nur einen Ratschlag: abhängig von der Art der Anwendung ist es eine saugefährliche Nummer einen Timestamp als Primärschlüssel zu verwenden. Je nach Systemlast, paralleler Verarbeitung, Clusterung oder sonstwas kann es durchaus relativ einfach vorkommen, dass zwei Sätze um exakt die selbe Zeit geschrieben werden.

        Danke für deine Besorgnis. :-)
        Jedoch hilft mir das nicht weiter ;)

        warum möchtest Du in der Spalte "time" unterschiedliche Werte stehen haben, obwohl gleiche doch richtig wären?

        $query = "UPDATE XYZ SET time = '".$time."' WHERE id = '".$row['id']."'";

        von welchem Datentyp ist denn Deine Spate time?

        Freundliche Grüße

        Vinzenz

        1. Sali,

          warum möchtest Du in der Spalte "time" unterschiedliche Werte stehen haben, obwohl gleiche doch richtig wären?

          Das System sortiert Einträge nach Aktualität (Timestamp) - falls mehrere Einträge den gleichen Timestamp haben funktioniert dies nicht mehr. Somit brauche ich dies wo ich oben beschrieben habe.

          von welchem Datentyp ist denn Deine Spate time?

          INTEGER

          Gruss
          fritz85

          1. hallo,

            Das System sortiert Einträge nach Aktualität (Timestamp) - falls mehrere Einträge den gleichen Timestamp haben funktioniert dies nicht mehr. Somit brauche ich dies wo ich oben beschrieben habe.

            ich würde in dem fall eine ID-Spalte als Primary Key anlegen mit auto_increment. bei der sortierung hat dann der timestamp priorität, und bei gleichem timestamp wird die ID zur sortierung herangezogen. somit hast du eine  konsistente datenbank und eine richtige sortierung.

            von welchem Datentyp ist denn Deine Spate time?

            INTEGER

            nimm doch DATETIME?

            Gruß,
            Niklas

            1. Hallo

              ich würde in dem fall eine ID-Spalte als Primary Key anlegen mit auto_increment. bei der sortierung hat dann der timestamp priorität, und bei gleichem timestamp wird die ID zur sortierung herangezogen. somit hast du eine  konsistente datenbank und eine richtige sortierung.

              Wie könnte ich denn das am besten umsetzen? Gibt es einen Befehl in PHP der Doppeleinträge also wie hier der Fall gleichen Timestamp findet und dann z.B. nach ID sortieren würde?

              1. Hello,

                Wie könnte ich denn das am besten umsetzen? Gibt es einen Befehl in PHP der Doppeleinträge also wie hier der Fall gleichen Timestamp findet und dann z.B. nach ID sortieren würde?

                WIESO PHP? Du nutzt doch sowieso eine Abfrage der Art SELECT thing FROM table WHERE kriterien ORDER BY time.
                Niemand hindert dich jetzt, als Sekundärkriterium (das nur bei gleichem Primärkriterium wirksam wird) die Spalte id mit in die Sortierung aufzunehmen:
                ORDER BY time, id

                Wobei ich mich mal wieder mit dem Standardsatz verabschieden werde, dass natürlich auch die ID lediglich ein eindeutiger Wert ist, auf dessen fachliche Bedeutung man sich NIE verlassen sollte.

                MfG
                Rouven

                --
                -------------------
                sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
                When the only tool you've got is a hammer, all problems start to look like nails.
                1. Hallo

                  WIESO PHP? Du nutzt doch sowieso eine Abfrage der Art SELECT thing FROM table WHERE kriterien ORDER BY time.
                  Niemand hindert dich jetzt, als Sekundärkriterium (das nur bei gleichem Primärkriterium wirksam wird) die Spalte id mit in die Sortierung aufzunehmen:
                  ORDER BY time, id

                  Hab ich probiert ORDER BY time, id das funktioniert nicht dann springt er nicht im Paging 1,2,3 sondern 1,44,98,1

                  hab nun das probiert.. Doppelte Einträge filtern und den Timestamp + 1 ändern. Das funktioniert wenn es nur 2 Einträge aber wenn 3 Einträge doppelt sind funktioniert es nicht mehr. Hat da jemand eine Alternative?

                  Gruss

                  1. Hello,

                    Hab ich probiert ORDER BY time, id das funktioniert nicht dann springt er nicht im Paging 1,2,3 sondern 1,44,98,1

                    dann hast du jetzt einen neuen Fehler gefunden.

                    Die Variante mit dem +1 wird so nicht funktionieren, weil die Datenbank jetzt nur auf alle Sätze ab dem zweiten eins drauf gerechnet hat.
                    Wenn du wirklich wirklich wirklich unterschiedliche Zeitstempel benötigst solltest du entweder beim INSERT schon eine Schleife statt eines Statements benutzen oder hinterher eine Wartungsschleife laufen lassen, die bei gleichem Zeitstempel eine entsprechende Korrektur vornimmt. Beides wirst du allerdings außerhalb der Datenbank machen wollen.

                    MfG
                    Rouven

                    --
                    -------------------
                    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
                    Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
                    1. Hallo

                      Die Variante mit dem +1 wird so nicht funktionieren, weil die Datenbank jetzt nur auf alle Sätze ab dem zweiten eins drauf gerechnet hat.
                      Wenn du wirklich wirklich wirklich unterschiedliche Zeitstempel benötigst solltest du entweder beim INSERT schon eine Schleife statt eines Statements benutzen oder hinterher eine Wartungsschleife laufen lassen, die bei gleichem Zeitstempel eine entsprechende Korrektur vornimmt. Beides wirst du allerdings außerhalb der Datenbank machen wollen.

                      genau so ist es ab dem zweiten wird eins drauf gerechnet.

                      //ALLE SELEKTIEREN
                      $query_doppel="select count(*) as counter, min(id) as id, time FROM XYZ GROUP BY time having counter > 1";

                      while($row_doppel = mysql_fetch_assoc($query_doppel))
                      {
                       $id_db  = $row_doppel['id'];
                       $time_db = $row_doppel['time'];

                      for($x=1; $x<=$all; $x++)
                      {
                       $time_new  = $time_db+$x;
                      }
                      $query_doppel_update="UPDATE XYZ SET time = '".$time_new."' WHERE id != '".$id_db."' AND time = '".$time_db."'";
                      }

                      So sieht das momentan aus - Steh gerade extrem auf dem Schlauch.. Kannst du mir da nicht helfen :(.

                      1. Hab den Schlauch wieder freigegeben habs nun so:

                        for($x=1; $x<=$all; $x++)
                        {

                        //ALLE SELEKTIEREN
                        $query_doppel="select count(*) as counter, min(id) as id, time FROM XYZ GROUP BY time having counter > 1";

                        while($row_doppel = mysql_fetch_assoc($query_doppel))
                        {
                        $id_db  = $row_doppel['id'];
                        $time_db = $row_doppel['time'];

                        $time_new  = $time_db+$x;
                        $query_doppel_update="UPDATE XYZ SET time = '".$time_new."' WHERE id != '".$id_db."' AND time = '".$time_db."'";
                        }
                        }

                        Danke für die Hilfe Gruss fritz85

                      2. So sieht das momentan aus - Steh gerade extrem auf dem Schlauch.. Kannst du mir da nicht helfen :(.

                        wie schon gesagt, die sort Variante sollte eigentlich funktionieren, wenn dein Szenario so ist wie du es beschreibst.

                        Struppi.