Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Query offset

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Query offset

    Hallo, ich stehe momentan etwas auf dem Schlauch, wie ich eine Anzahl von queries auf kleinere Stücke (hier zu 150) aufteilen kann. Ich weiß wie viele Elemente es von thing gibt und ich kann things mit einem offset abfragen.

    Ist $count ohne Rest durch 150 teilbar ist es ja durchaus sehr einfach. Jedoch macht mich der Rest fertig und ich komme nicht darauf wie man sowas erledigt. Kann mir jemand einen Tip geben?

    PHP-Code:
    <?php
    function query_all() {
        
    $count  167//count_things();
        
    $chunks intval ($count 150);
        
    $carryover $count 150;
        
    $total $chunks $carryover;
        
        for( 
    $offset 0$offset $total$offset+=150 ) {
            if( (
    $total $chunks) % 150 == ) {
                
    $offset += $carryover;
            }
            foreach( 
    query_things( array( 'offset' => $offset) ) as $thing ) {
                
    print_thing$thing );
            }
        }
    }


  • #2
    Wozu willst du dich selbst darum kümmern? Wenn du nur 167 Einträge in der Datenbank hast und von Position 150 aus wieder 150 Einträge abrufst, dann kommen auch nur 17 Einträge zurück.
    Zitat von nikosch
    Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

    Kommentar


    • #3
      Du meinst so?
      PHP-Code:
      <?php
      function query_all() {
          
      $count  167//count_things();
          
      $chunks intval ($count 150) + 1;
          
          for( 
      $offset 0$offset $chunks*150$offset+=150 ) {
              foreach( 
      query_things( array( 'offset' => $offset) ) as $thing ) {
                  
      print_thing$thing );
              }
          }
      }
      Damit laufe ich ja einmal mehr über alle chunks und erwische die restlichen.

      Kommentar


      • #4
        Eher so:
        PHP-Code:
        function query_all() { 
            
        $count  167//count_things(); 
            
        $chunks ceil ($count 150); 
             
            for( 
        $chunk 0$chunk$chunks$chunk++ ) { 
                foreach( 
        query_things( array( 'offset' => $chunk*150) ) as $thing ) { 
                    
        print_thing$thing ); 
                } 
            } 

        Das
        PHP-Code:
        $chunks ceil ($count 150); 
        ist besser, da du sonst einen Chunk zu viel bekommst, wenn die Anzahl grade durch 150 teilbar ist.
        Zitat von nikosch
        Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

        Kommentar


        • #5
          Ja cool, kannte ceil noch nicht. So gefällt mir das schon besser und ich bin überrascht, dass es doch so einfach ist.

          Vielen Dank!

          Kommentar


          • #6
            Warum überhaupt das gerechne mit chunks? Erst durch 150 um es zwei Zeilen später wieder mal 150 zu nehmen?

            PHP-Code:
            function query_all() { 
                
            $count  167//count_things(); 

                
            for( $offset 0$offset $count$offset+= 150 ) {
                    foreach( 
            query_things( array( 'offset' => $offset) ) as $thing ) { 
                        
            print_thing$thing ); 
                    } 
                } 

            Kommentar


            • #7
              Stimmt.. Naaa wirds doch noch ein Einzeiler?

              Kommentar


              • #8
                Womöglich. Wozu brauchst du überhaupt die Queries innerhalb der Schleife? Das ist meistens keine gute Idee. (Bei Pagination und Co ist der Trick mit dem Offset ja eben der, NICHT alle Datensätze zu laden.)

                Kommentar


                • #9
                  Aber genau damit vermeide ich doch alle auf einmal zu laden. Ich lade hier die Beiträge einer Website, was schon mal einige hundert sein können, daher dachte ich es sei besser nicht alle auf einmal zu laden sondern in 150/250/450 Teilen zu laden.

                  Kommentar


                  • #10
                    Zitat von No3x Beitrag anzeigen
                    Stimmt.. Naaa wirds doch noch ein Einzeiler?
                    Da lässt sich auch ein Einzeiler mit nur einer einzigen Schleife draus machen. Ich denke aber das Zeil ist lesbarer Code und nicht kurzer Code.


                    Zitat von Tropi Beitrag anzeigen
                    Womöglich. Wozu brauchst du überhaupt die Queries innerhalb der Schleife? Das ist meistens keine gute Idee. (Bei Pagination und Co ist der Trick mit dem Offset ja eben der, NICHT alle Datensätze zu laden.)

                    Ein Query ist nicht zwangsläufig eine SQL Abfrage. Ich würde sagen hier geht es eher um ein Webservice...
                    oder auch nicht.

                    PS: wieso gibts eigentlich keine Durchstreichfunktion in dem Forum?!

                    Kommentar


                    • #11
                      Zitat von erc Beitrag anzeigen
                      Da lässt sich auch ein Einzeiler mit nur einer einzigen Schleife draus machen. Ich denke aber das Zeil ist lesbarer Code und nicht kurzer Code.
                      War eher als Spaß gemeint, da der Code imemr schmaler wurde.

                      Zitat von erc Beitrag anzeigen
                      Ein Query ist nicht zwangsläufig eine SQL Abfrage. Ich würde sagen hier geht es eher um ein Webservice...
                      Es handelt sich um SQL Abfragen.

                      Kommentar


                      • #12
                        Zitat von No3x Beitrag anzeigen
                        Aber genau damit vermeide ich doch alle auf einmal zu laden. Ich lade hier die Beiträge einer Website, was schon mal einige hundert sein können, daher dachte ich es sei besser nicht alle auf einmal zu laden sondern in 150/250/450 Teilen zu laden.
                        Wenn du das in einem Request machst, so wie derzeit ist diese Praktik aber hinfällig. Wenn du tatsächlich alle Datensätze brauchst kannst du dir ruhig alle auf einmal zurückgeben lassen. (Achtung: Das bezieht sich auf die SQL-Abfrage, NICHT auf das Fetchen der Daten mit PHP. Von fetchAll() ist idR abzuraten.)

                        Die Sache ist jedoch: In der Regel braucht man gar nicht alle Datensätze. Siehe z.B. hier das PHP-Eintsteigerforum. Ganz unten steht "Zeige Themen 1 bis 35 von 14332". Höchstwahrscheinlich wirst nie ein Benutzer ALLE Threads durchschauen, und spätestens nach 300 Themen aufhören - was bedeutet das die Datenbank JEDES Mal 14.000 Datensätze liefert, die gar nicht benötigt werden.

                        Was du, denke ich, vor hast heißt Pagination. Dazu findest du bestimmt genug wenn du mit dem Stichwort suchst. Falls das nicht dein Ziel ist => Erklärung.

                        Kommentar


                        • #13
                          Wieso unterstellt mir jeder ich benötige die Datensätze nicht?
                          Ich muss jeden einzelnen Post durchgehen und den Inhalt auslesen. Ich hole sie mir nicht alle auf einmal, da das Stück Software später auch auf Webservern mit mit weniger RAM laufen soll.

                          Kommentar


                          • #14
                            Ich bezweifle, dass dir das einen Vorteil bringt bezüglich des RAM-Verbrauchs. Und den Inhalt könntest du höchstwahrscheinlich auch mit einem Join holen.
                            GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                            Kommentar


                            • #15
                              Zitat von ChristianK Beitrag anzeigen
                              Ich bezweifle, dass dir das einen Vorteil bringt bezüglich des RAM-Verbrauchs. Und den Inhalt könntest du höchstwahrscheinlich auch mit einem Join holen.
                              Begründung für den RAM-Verbrauch?

                              Die geholten Objekte nehmen nie mehr (nie mehr bezogen auf nicht mehr als 1000 Objekte auf einmal holen) einen RAM-Verbrauch von 150*Objektgröße ein + der Kram für die Query.

                              Ein Join wäre eine Option.

                              Kommentar

                              Lädt...
                              X