Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] nächst größere ID

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] nächst größere ID

    Hallo,
    ich hab ein banales Problem, hoffe ich doch.

    Und zwar frage ich ab ob dem User die sid zugewiesen ist. Danach soll der nächste Eintrag mit nächst höchsteren ID umgeändert werden, den status auf "1" zu setzen. Das Problem bei der jetzigen Variante ist das er einen belieben Datensatz rausnimmt der höher als der jetztige ist.
    Abzufragen was der nächste autoinc. wert ist funktioniert nicht. Da auch amndere User dort eingetragen werden und diese nicht die gleiche sid haben.
    Ich hoffe soweit verstanden, hier die Abfrage:

    PHP-Code:
    // Nächsten Eintrag vorbereiten
    $db->query("UPDATE stadt_bauschleife_einheiten SET status='1' WHERE sid='$row[sid]' AND id > '$row[id]' LIMIT 1"); 
    Vielen dank, einen schönen Nachmittag noch )


  • #2
    Sorry aber ich hab nich verstanden was du meinst. Les dir doch mal deinen Text durch, das ist doch nich wirklich verständlich. Außerdem weiß ich weder was bei dir eine sid ist noch was es bedeutet einen Eintrag "umzuändern".

    Kommentar


    • #3
      Ich hoffe soweit verstanden,
      Absolut Nein. Sorry, muß da Florian zustimmen. Beschreibe in einfachen, klaren Sätzen deutlich was Du vor hast.
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4


        Es handelt sich hierbei um eine Bauschleife.
        Also "sid" gilt als die StädteId. Die ist um die Aufträge in der Bauschleife zu zuordnen.

        Die Tabelle sieht wie folgt aus:
        UHRZEIT: 19:51
        id | sid |eid (einheiten id) | menge | startzeit | bauzeit (gesamt) | status
        ************************************************** *******
        1 | 1 | 0 | 5 19:50 2 min | 1
        2 | 2 | 0 | 5 19:51 2 min | 1
        3 | 1 | 0 | 5 19:52 2 min | 0
        4 | 1 | 0 | 5 19:54 2 min | 0
        5 | 1 | 0 | 5 19:56 2 min | 0

        Zum Eintragen in die DB:
        Der Erste Eintrag wird immer auf status=1 gesetzt. Kommen jetzt weitere hinzu bekommen diese status=0 (damit meine Bauschleife kapiert das diese nicht an der Reihe sind).

        Nun kommt mein Problem jetzt ist z.B. für ID 1 die Bauzeit vorbei, nun muss ja die nächst höhere ID genommen werden, sprich ID 3. Das Problem ist aber bei meiner jetzigen Abfrage es wird dann z.B. manchmal 3 oder 4 genommen.

        Jetzt verständlich? Dankeschön

        Kommentar


        • #5
          Wth ist eine "Bauschleife"? Weißer Mann spricht in Rätseln
          Jetzt verständlich?
          Nö. Waum wird da 3 oder 4 genommen?

          Ich rate trotzdem mal in den blauen Dunst: Setze abgearbeitete per UPDATE auf status 0 und suche dann über ein Select LIMIT 1 den ersten Datensatz mit status 1. So sollte es gehen.
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Eine Bauschleife kennst du sicher, sie fungiert z.B. in Browsergames dazu um Einheiten zu produzieren, oder Gebäude so das man nicht immer online sein muss.

            3 oder 4 wird genommen weil es sich um sid 1 handelt (Man gehe von dem Standpunkt aus das man die Stadt "1" hat - sprich |sid|-> 1

            Das wäre eine Variante das ist richtig. Ich dachte das es da vielleicht ein SQL Befehl oder Operator oder so gibt. Der den ersten Eintrag in der DB mit der spalte "sid = 1" in diesem Fall abfragt. - Gibt es sowas?

            Kommentar


            • #7
              Wieso die erste? Maßgeblich ist doch die erste mit einem bestimmt status? Oder ich habs immer noch nicht verstanden.

              PS: Nicht immer davon ausgehen, dass jeder Progranmmierer automatisch Browsergame-Fan ist.
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Wieso selektierst du dann nicht genau EINEN Datensatz WO sid = 1 und SORTIERST absteigend dass eben der erste gefundene Datensatz die kleinste ID hat?? Oder ist das nicht richtig?

                Kommentar


                • #9
                  Genau das habe ich jetzt gemacht. Habe gehoff das es in MySQL sowas vielleicht gibt und mir so einen query spare. Trotzdem danke.

                  Schönen abend noch.

                  Kommentar


                  • #10
                    Wieso musst du überhaupt den Status setzen? Es ist doch eh klar dass immer der Bauauftrag mit der niedrigsten ID der aktuelle ist. Daher ist doch die Information "status" überflüssig! Du musst nur überall wo gebaut wird eben dieses LIMIT und die ORDER BY Klausel nutzen! So musst du überhaupt nichts updaten.

                    Kommentar


                    • #11
                      Das ist soweit richtig, das Problem hierbei ist aber das mein Javascriptcounter ansonsten nicht erkennt bei welchem er zählen soll, und bei welchem nicht.
                      Gruß s1x

                      Kommentar


                      • #12
                        Wieso Javascript? Mit Javascript kannst du nicht direkt auf die Datenbank zugreifen. Also wirst du wohl auf irgendwelche Daten zugreifen die du per PHP bereit stellst und deshalb kannst du so oder so auch irgend einen Indikator in HTML schreiben anhand das Javascript dies erkennt.

                        Das ist einfach mal wieder ein Fehler im gesamten Design. Du musst Daten doppelt speichern, also kommst du auf mehr Datenbankabfragen, umständliche Abfragen und unnötige Probleme!

                        Kommentar


                        • #13
                          Hm. Also der Javascriptcounter wird ja dort wiedergegeben wo ein simples Select gemacht wird. Da muss ich ja so oder so die Liste abrufen, und ob ich da jetzt ein [...]

                          PHP-Code:
                          // Wenn nicht aktiv
                          if($row[status] == 1){
                              
                          $tpl->replace("BAUZEIT",'<var id="count'.$counterindex.'">'.sectodhmsstr($bauzeit).'</var>');
                          } else {
                              
                          $tpl->replace("BAUZEIT",'Warte..');

                          [...] mehr oder wenigerhabe ist doch jetzt nicht sonderlich schlim oder?
                          Schönen Abend noch.

                          PS: Oder habe ich da jetzt etwas falsch verstanden?

                          Kommentar


                          • #14
                            Ich hab keine Ahnung was du meinst. Ich wollte dir nur Erklären dass du dieses Status Feld in der Datenbank NICHT brauchst, auch nicht für JavaScript!

                            Kommentar


                            • #15
                              Also der SQL-Audruck müsste dann so lauten:
                              PHP-Code:
                              // Nächsten Eintrag vorbereiten
                              $db->query("UPDATE stadt_bauschleife_einheiten SET status='1' WHERE sid='$row[sid]' AND id > '$row[id]' ORDER BY id ASC LIMIT 1"); 
                              Und ja, das mitm Status macht eigentlich nur Probleme:
                              * du musst es immer updaten
                              * du hast unnötig doppelte Daten
                              * bei dem oberen Query, musst du auch noch überprüfen, ob es überhaupt ein weiteres Gebäude in der Bauschleife gibt. Schon wieder Mehraufwand.

                              Mein Vorschlag wäre:
                              Lass die Status-Spalte weg, und ermittle sämtliche Einheiten in der Bauschleife mit diesem Ausdruck:

                              "SELECT * FROM stadt_bauschleife_einheiten WHERE sid = '$sid' ORDER BY id ASC"
                              bzw. noch mitm Limit 1 hinten dran, wenn du wirklich nur den ersten Eintrag haben möchtest (der der grad aktiv ist).

                              Wenn der aktuelle Bauauftrag abgeschlossen ist, dann entfernst du ihn per
                              "DELETE FROM stadt_bauschleife_einheiten WHERE sid = '$sid' ORDER BY id ASC LIMIT 1"

                              Und vergiss nicht "id" als PRIMARY KEY und für "sid" einen INDEX anzulegen. Das sollte später die Performance etwas erhöhen.

                              Kommentar

                              Lädt...
                              X