Hans Bauer: MySQL: LIMIT & WHERE zusammen funktioniert nicht

Hallo zusammen,

ich bin gerade dabei, mich mit dem PHP- Framework CodeIgniter zu beschäftigen. Ich will ein relativ einfaches Blog realisieren; dafür greife ich auf meine schon von meiner Wordpress- Installation existierende Datenbank zurück. Alle Einträge anzuzeigen, geht problemlos. Da aber dann auch jede Menge Datensätze, die von Wordpress als Zwischenspeicherung generiert wurden, angezeigt werden, will ich die Anzeige mit LIMIT etwas einschränken. Hier mal der Code:

return $this->db->get_where($db_table, array('post_status' => 'publish'), $limit, $offset);

Der Code sollte eigentlich wie folgt ablaufen: Zuerst wird die Datentabelle ausgewählt, dann wird eine WHERE- Bedingung formuliert (soll ergeben: WHERE post_status = publish) und dann werden noch die Parameter für das LIMIT angegeben.

In SQL müsste der Code so sein:

SELECT * FROM $db_table WHERE 'post_status' = 'publish' LIMIT $offset, $limit

Warum funktioniert das Zusammenspiel von WHERE und LIMIT nicht so, wie ich das will?

Für eine Antwort wäre ich dankbar.

Viele Grüße,

Hans

  1. Warum funktioniert das Zusammenspiel von WHERE und LIMIT nicht so, wie ich das will?

    Was sagt denn die Fehlerbehandung von MySQL dazu?

  2. Hello,

    SELECT * FROM $db_table WHERE 'post_status' = 'publish' LIMIT $offset, $limit

    Warum funktioniert das Zusammenspiel von WHERE und LIMIT nicht so, wie ich das will?

    Warum funktioniert das Query so überhaupt nicht?
    solltest Du besser fragen.

    Was ist 'post_status'?
    wäre eine andere Frage :-)

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Was ist 'post_status'?
      wäre eine andere Frage :-)

      Ein String der mit einem anderen String verglichen wird - wenn der Rest syntaktisch OK ist werden wohl immer 0 Datensätze geliefert :).

    2. Was ist 'post_status'?
      wäre eine andere Frage :-)

      'post_status' ist eine der vielen Spalten bei der Tabelle. Alle Beiträge, die in dieser Spalte 'post_status' den Wert 'publish' haben, sollen häppchenweise mit LIMIT ausgegeben werden. Wie stelle ich das richtig an?

      Danke schonmal für die schnellen Antworten.

      Viele Grüße aus dem schönen Bammental :)

      Hans

      1. Hello,

        'post_status' ist eine der vielen Spalten bei der Tabelle. Alle Beiträge, die in dieser Spalte 'post_status' den Wert 'publish' haben, sollen häppchenweise mit LIMIT ausgegeben werden. Wie stelle ich das richtig an?

        Wie werden denn Spaltennamen im Query angegben?

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hi Tom!

          Wie werden denn Spaltennamen im Query angegben?

          Das ist irrelevant [1], da Hans eine Methode von CodeIgniter verwendet.

          Im Moment ist nur die Antwort auf suits Frage interessant.

          [1] Natürlich nicht. Aber du bringst ihn auf eine vollkommen falsche Fährte.

          MfG H☼psel

          --
          "It's amazing I won. I was running against peace, prosperity, and incumbency."
          George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
          Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
          1. Hello H☼psel,

            Wie werden denn Spaltennamen im Query angegben?
            Das ist irrelevant [1], da Hans eine Methode von CodeIgniter verwendet.

            Sorry, das hatte ich übersehen.
            Also weiß Hans eigentlich gar nicht, wie sein Statement dann ausformuliert aussieht.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
          2. Hi Tom!

            »» Wie werden denn Spaltennamen im Query angegben?
            Das ist irrelevant [1], da Hans eine Methode von CodeIgniter verwendet.

            Im Moment ist nur die Antwort auf suits Frage interessant.

            [1] Natürlich nicht. Aber du bringst ihn auf eine vollkommen falsche Fährte.

            MfG H☼psel

            Ich habe mir das jetzt mit der Syntax dieser Funktion nochmal angeschaut, habe es ein wenig umgestellt und siehe da, jetzt funktioniert es. So sieht der Code jetzt aus:

            $status = "publish";  
            return $this->db->get_where($db_table, array('post_status' => $status), $limit, $offset);
            

            Vielen Dank nochmal und viele Grüße,
            Hans

            P.S. @Suit: MySQL hat mir auf meine Anfrage von vorhin wirklich ein leeres Resultat zurückgegeben.

            1. Hi Hans!

              Ich habe mir das jetzt mit der Syntax dieser Funktion nochmal angeschaut, habe es ein wenig umgestellt und siehe da, jetzt funktioniert es.

              Kannst du dir mal den SQL-Code ausgeben lassen?
              Mich interessiert der Unterschied zwischen

              $status = "publish";  
              return $this->db->get_where($db_table, array('post_status' => $status), $limit, $offset);
              

              und

              return $this->db->get_where($db_table, array('post_status' => 'publish'), $limit, $offset);

              MfG H☼psel

              --
              "It's amazing I won. I was running against peace, prosperity, and incumbency."
              George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
              Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      2. Hallo,

        » Was ist 'post_status'?
        » wäre eine andere Frage :-)

        nein, Tom legt hier schon den Finger auf eine wichtige Stelle.

        'post_status' ist eine der vielen Spalten bei der Tabelle. Alle Beiträge, die in dieser Spalte 'post_status' den Wert 'publish' haben, sollen häppchenweise mit LIMIT ausgegeben werden. Wie stelle ich das richtig an?

        das da:

        SELECT * FROM $db_table WHERE 'post_status' = 'publish' LIMIT $offset, $limit

        Wenn

        post_status

        ein Spaltenname ist, dann darfst Du ein SQL-Statement mit der Spalte post_status in MySQL wie folgt schreiben:

        a) ohne Quotes:
           SELECT * FROM $db_table WHERE post_status = 'publish'

        b) mit MySQL-eigenen Backticks gequoted:
           SELECT * FROM $db_table WHERE post_status = 'publish'

        c) mit der entsprechenden Einstellung von ANSI_QUOTES und doppelten Anführungszeichen:
           SELECT * FROM $db_table WHERE "post_status" = 'publish'

        Einfache Anführungszeichen zum Begrenzen von Spaltennamen zu verwenden, ist in allen drei Fällen falsch. Ich gehe davon aus, dass Dir ein Versehen beim Erstellen Deines Beitrags unterlaufen ist.

        Falls Dein Framework ein SQL-Statement zusammenbaut, wäre es interessant zu wissen, wie das Statement wirklich aussieht und wie die MySQL-Fehlermeldung aussieht, wenn es denn eine gibt. $offset und $limit sind meines Wissens ungültige Literale im Zusammenhang mit der LIMIT-Klausel :-)

        Bisher fehlen die wirklich relevanten Informationen:
        Was erwartest Du?
        Was erhältst Du stattdessen?

        Freundliche Grüße

        Vinzenz

        1. Ich gehe davon aus, dass Dir ein Versehen beim Erstellen Deines Beitrags unterlaufen ist.
          Falls Dein Framework ein SQL-Statement zusammenbaut, wäre es interessant zu wissen, wie das Statement wirklich aussieht und wie die MySQL-Fehlermeldung aussieht, wenn es denn eine gibt. $offset und $limit sind meines Wissens ungültige Literale im Zusammenhang mit der LIMIT-Klausel :-)
          Bisher fehlen die wirklich relevanten Informationen:
          Was erwartest Du?
          Was erhältst Du stattdessen?

          Hallo Vinzenz,
          1.) Nein, mir ist beim Erstellen des Beitrags kein Fehler unterlaufen. War alles ernst gemeint so. Aber anscheinend falsch. Habe ich aber jetzt hinbekommen.
          2.) Wie schon gesagt - so sieht das Statement (also die CI- Funktion) aus:
          return $this->db->get_where($db_table, array('post_status' => $post_status), $limit, $offset);
          Das ganze sieht dann in SQL so aus:
          SELECT * FROM $db_table WHERE post_status = 'publish' LIMIT $offset, $limit
          Übrigens: $offset und $limit wurden gesetzt, das hat alles seine Richtigkeit so.
          3.) 1. Ich erwarte eine Seite, die mir zum Beispiel die ersten zehn Datensätze ausgibt, bei denen 'post_status' auf 'publish' gesetzt wurde. Wenn ich dann unten bei der Seitennavigation auf [11-20] klicke, sollen mir die nächsten zehn Datensätze angezeigt werden usw. usf.
            2. Stattdessen erhalte ich a l l e Datensätze der Tabelle, also auch die ganzen Entwürfe und Zwischenspeicherungen. Die will ich aber nicht. Daher dann das mit LIMIT und WHERE. Hat sich aber jetzt geklärt.
          Viele Grüße,
          Hans

          1. Hallo Hans,

            » Ich gehe davon aus, dass Dir ein Versehen beim Erstellen Deines Beitrags unterlaufen ist.

            1.) Nein, mir ist beim Erstellen des Beitrags kein Fehler unterlaufen. War alles ernst gemeint so. Aber anscheinend falsch. Habe ich aber jetzt hinbekommen.

            ich denke doch :-) Schließlich korrigierst Du es hier in diesem Posting, auf das ich antworte:

            Original:

            » » SELECT * FROM $db_table WHERE 'post_status' = 'publish' LIMIT $offset, $limit

            jetzt:

            SELECT * FROM $db_table WHERE post_status = 'publish' LIMIT $offset, $limit

            und meine Kommentare zu

            'post_status' versus post_status oder post\_status oder "post_status"

            Übrigens: $offset und $limit wurden gesetzt, das hat alles seine Richtigkeit so.

            Sie werden gesetzt, in einem SQL-Statement haben jedoch irgendwelche die Namen von PHP-Variablen keinen Nutzen, insbesondere keinen hinsichtlich Fehlersuche. Es ist jedoch schon mehr als einmal vorgekommen, dass solche Variablen nicht das enthielten, was der Fragesteller meinte. Aus diesen Gründen ist das *wirkliche SQL-Statement*, völlig befreit von irgendwelchem Fremdcode (das könnte auch Python, Perl oder C# sein) von Interesse - ein Mischmasch von SQL und $programmiersprache in aller Regel nicht.

            3.) 1. Ich erwarte eine Seite, die mir zum Beispiel die ersten zehn Datensätze ausgibt, bei denen 'post_status' auf 'publish' gesetzt wurde. Wenn ich dann unten bei der Seitennavigation auf [11-20] klicke, sollen mir die nächsten zehn Datensätze angezeigt werden usw. usf.

            Die Benutzerführung der Dokumentation von CodeIgniter erschließt sich mir zwar nicht so recht, aber CodeIgniter hat eine Pagination Class. Kannst Du diese nicht für Deine Zwecke verwenden?

            Freundliche Grüße

            Vinzenz

            1. Sie werden gesetzt, in einem SQL-Statement haben jedoch irgendwelche die Namen von PHP-Variablen keinen Nutzen, insbesondere keinen hinsichtlich Fehlersuche. Es ist jedoch schon mehr als einmal vorgekommen, dass solche Variablen nicht das enthielten, was der Fragesteller meinte. Aus diesen Gründen ist das *wirkliche SQL-Statement*, völlig befreit von irgendwelchem Fremdcode (das könnte auch Python, Perl oder C# sein) von Interesse - ein Mischmasch von SQL und $programmiersprache in aller Regel nicht.

              Meinst du etwa sowas?

              SELECT * FROM eintrag_tabelle WHERE post_status = 'publish' LIMIT 0, 10

              Ich habe für die Variablen mal ein paar Testzahlen eingetragen. Die erste nach LIMIT (die "0") variiert dann, je nachdem, auf welcher Seite man sich befindet.

              Die Benutzerführung der Dokumentation von CodeIgniter erschließt sich mir zwar nicht so recht, aber CodeIgniter hat eine Pagination Class. Kannst Du diese nicht für Deine Zwecke verwenden?

              Genau diese Pagination Class habe ich bereits im Einsatz und ich habe sie (nach anfänglichen Schwierigkeiten) jetzt am Laufen - problemlos.
              Diese Pagination Class hilft mir aber glaube ich nicht beim Filtern von Tabelleneinträgen. Sie ist ja schließlich für die Darstellung der Paginierung zuständig, oder nicht?

              Viele Grüße,

              Hans

              1. Hallo,

                » Aus diesen Gründen ist das *wirkliche SQL-Statement*, völlig befreit von irgendwelchem Fremdcode (das könnte auch Python, Perl oder C# sein) von Interesse - ein Mischmasch von SQL und $programmiersprache in aller Regel nicht.

                Meinst du etwa sowas?
                SELECT * FROM eintrag_tabelle WHERE post_status = 'publish' LIMIT 0, 10

                ja, so etwas. Nur typischerweise der tatsächlich generierte Code :-)

                Diese Pagination Class hilft mir aber glaube ich nicht beim Filtern von Tabelleneinträgen. Sie ist ja schließlich für die Darstellung der Paginierung zuständig, oder nicht?

                Ich habe mit CodeIgniter noch nie gearbeitet; mein bisheriger Eindruck[1] ermuntert mich auch nicht, es in Betracht zu ziehen.

                Freundliche Grüße

                Vinzenz

                [1] der täuschen kann.

                1. Ich habe mit CodeIgniter noch nie gearbeitet; mein bisheriger Eindruck[1] ermuntert mich auch nicht, es in Betracht zu ziehen.

                  [1] der täuschen kann.

                  1. Warum genau ermuntert dich dein erster Eindruck nicht, dich mit CI näher zu befassen?
                  2. Hast du schon einmal mit einem PHP- Framework gearbeitet? Wenn ja, welches? Ich bin nämlich auch noch auf der Suche nach d e m Framework. Als Anfang habe ich halt mal in CI reingeschaut.

                  Viele Grüße,

                  Hans

                  1. Hallo Hans,

                    » Ich habe mit CodeIgniter noch nie gearbeitet; mein bisheriger Eindruck[1] ermuntert mich auch nicht, es in Betracht zu ziehen.
                    »
                    » [1] der täuschen kann.

                    1. Warum genau ermuntert dich dein erster Eindruck nicht, dich mit CI näher zu befassen?

                    die sich mir nicht erschließende Logik bei der Navigation, wobei ich mir vorstelle, dass die Navigation mit CodeIgniter erzeugt wurde.

                    1. Hast du schon einmal mit einem PHP- Framework gearbeitet?

                    Ja,

                    Wenn ja, welches?

                    mit symfony.

                    Freundliche Grüße

                    Vinzenz

                    1. »» 1. Warum genau ermuntert dich dein erster Eindruck nicht, dich mit CI näher zu befassen?

                      die sich mir nicht erschließende Logik bei der Navigation, wobei ich mir vorstelle, dass die Navigation mit CodeIgniter erzeugt wurde.

                      »» 2. Hast du schon einmal mit einem PHP- Framework gearbeitet?

                      Ja,
                      mit symfony.

                      Ist es denn mit Symfony einfacher, eine Navigation nach dem Schema
                      Erster < 1 2 3 4 5 6 > Letzter
                      zu erstellen?
                      Wie ist es allgemein, mit Symfony zu arbeiten? Würde mich interessieren ...

                      Viele Grüße,

                      Hans