Phil: Php & Mysql, Zeilen Schrittweise ausgeben

Hallo Zusammen,

Ich habe ein Problem. Ich habe eiine Mysql Datenbank. Sie ist wie folgt angelegt,

num, image, name

Das sieht das zum Beispiel so aus,

1 | aaa.jpg | John
2 | bbb.jpg | Doe
3 | ccc.jpg | Jane
4 | ddd.jpg | Doe

Nun würde ich gerne mit PHP die Zeilen Schrittweise oder einzeln ausgeben. Sol heissen, ich würde gerne mit PHP Zeile 1, 3, 6 und 10 ausgeben. Wie mache ich das?

Vielen Dank, ein schönen Sonntag auch, Gruss Phil

  1. Hallo

    Nun würde ich gerne mit PHP die Zeilen Schrittweise oder einzeln ausgeben. Sol heissen, ich würde gerne mit PHP Zeile 1, 3, 6 und 10 ausgeben. Wie mache ich das?

    Indem du zum Beispiel die Abfrage auf die entsprechenden Zeilen begrenzt:

    SELECT
      *
    FROM
      tabelle
    WHERE
      num IN (1, 3, 6, 10)
    LIMIT 4

    1. Hallo Mav,

      SELECT
        *
      FROM
        tabelle
      WHERE
        num IN (1, 3, 6, 10)
      LIMIT 4

      was soll eigentlich das LIMIT 4 bewirken?
      Lass es einfach weg ...

      mbG Rolf

      1. Hallo,

        was soll eigentlich das LIMIT 4 bewirken?
        Lass es einfach weg ...

        Es werden exakt 4 Datensätze erwartet. Warum dann nicht also auch die Abfrage auf maximal 4 Zeilen beschränken? Macht sicher bei einer Tabelle mit 10 Zeilen noch keinen Sinn, aber wenn es 10.000 Datensätze sind dürftest du den Geschwindigkeitsunterschied merken, da MySQL nämlich nach den 4 gefundenen Datensätzen sofort aufhört zu suchen und nicht noch versucht weitere passende Datensätze zu finden.

        1. Vielen Dank für Eure Hilfe.

          Klingt einleuchtend! Eine kleine Frage habe ich noch, welche ich nicht aus den Antworten herauslesen konnte,

          Wenn ich nun die Datensätze nach den Namen sortiere, (order by name) kann ich dann die Datensätze Schrittweise ausgeben, zum Beispiel das jede dritte Zeile angezeigt wird?

          Danke und ein schöner Sonntag! Gruss Phil

          1. Hallo Phil,

            Wenn ich nun die Datensätze nach den Namen sortiere, (order by name) kann ich dann die Datensätze Schrittweise ausgeben, zum Beispiel das jede dritte Zeile angezeigt wird?

            verstehe ich Dich richtig: Du bist nur an jedem dritten Datensatz interessiert, d.h. bei den vier Datensätzen Deines Beispiels möchtest Du _nach_ der Sortierung nur den dritten Eintrag haben? Ja, das geht auch.

            Es sollte Dir einleuchten, dass es besser ist, nur die Daten vom DBMS anzufordern, die man verarbeiten will. Deswegen solltest Du nun Deine Abfrage umschreiben. Die Abfrage wird schon deutlich komplizierter. Du benötigst eine Benutzervariable und eine Unterabfrage (setzt übrigens MySQL 4.1.x oder höher voraus).

            Deine Beispieldaten

            1 | aaa.jpg | John
            2 | bbb.jpg | Doe
            3 | ccc.jpg | Jane
            4 | ddd.jpg | Doe

            1. Schritt: Wir zählen mit:

              
            SET @a=0;                     -- Initialisieren einer Benutzervariablen  
            SELECT  
                @a:=(@a+1) position,      -- Erhöhe den Wert bei jedem Datensatz um 1  
                num,                      -- die interessierenden Spalten  
                image,  
                name  
            FROM  
                tabelle                   -- Deiner Tabelle  
            ORDER BY                      -- sortiert nach der Spalte  
                name                      -- name
            

            liefert bei Deinen Beispieldaten folgendes (mögliche) Ergebnis

            position | num | image   | name
            --------------------------------
                  1  |   4 | ddd.jpg | Doe
                  2  |   2 | bbb.jpg | Doe
                  3  |   3 | ccc.jpg | Jane
                  4  |   1 | aaa.jpg | John

            Beachte bitte, dass die Reihenfolge der ersten beiden Datensätze in der Ergebnismenge zufällig ist. Sie könnte somit auch umgekehrt sein.

            Nun willst Du nur den dritten Datensatz haben:

              
            SET @a=0;                     -- Initialisieren einer Benutzervariablen  
            SELECT  
                a.position,  
                a.num,  
                a.image,  
                a.name  
            FROM (                        -- Du kannst statt Spalten einer Tabelle auch  
                SELECT                    -- die Spalten einer Abfrage abfragen  
                                          -- Das nennt man Unterabfrage  
                    @a:=(@a+1) position,      -- Erhöhe den Wert bei jedem Datensatz um 1  
                                              -- Gib der Spalte einen sprechenden Namen  
                    num,                      -- die interessierenden Spalten  
                    image,  
                    name  
                FROM  
                    tabelle                   -- Deiner Tabelle  
                ORDER BY                      -- sortiert nach der Spalte  
                    name                      -- name  
            ) a                               -- Gib der Unterabfrage einen Namen, damit  
                                              -- Du auf ihre Spalten zugreifen kannst  
            WHERE  
                [link:http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_mod@title=MOD(position, rang) = 0  
                                              -- nur die Zeilen, deren Position ein  
                                              -- Vielfaches von 3 ist, d.h. jeden dritten  
                                              -- Datensatz  
            
            

            liefert die gewünschte Ergebnismenge (zumindest so, wie ich Dich verstanden habe):

            position | num | image   | name
            --------------------------------
                  3  |   3 | ccc.jpg | Jane

            Beachte bitte, das das SET-Statement und das SELECT-Statement in der gleichen Verbindung abgesetzt werden müssen. Ein typischer Fall für mysqli.

            Freundliche Grüße

            Vinzenz

        2. Hallo

          was soll eigentlich das LIMIT 4 bewirken?
          Lass es einfach weg ...

          Ja. LIMIT ist überflüssig und schädlich. Es bringt keinen Nutzen, dafür aber unnötige Verständnisschwierigkeiten und schränkt die Portabilität ein. Es gibt ganz genau keinen Grund, hier LIMIT zu verwenden.

          Es werden exakt 4 Datensätze erwartet. Warum dann nicht also auch die Abfrage auf maximal 4 Zeilen beschränken?

          Nein.

          Macht sicher bei einer Tabelle mit 10 Zeilen noch keinen Sinn, aber wenn es 10.000 Datensätze sind dürftest du den Geschwindigkeitsunterschied merken,

          Nein. Kein Geschwindigkeitsunterschied. Vielleicht sogar ein Verlust.
          Selbstverständlich wird ein Index auf der Spalte num vorausgesetzt.

          Freundliche Grüße

          Vinzenz

  2. Hallo Phil,

    Ich habe ein Problem. Ich habe eiine Mysql Datenbank. Sie ist wie folgt angelegt,

    als Begriffsklärung: Das sind die Spalten einer Tabelle in einer Datenbank, die von dem Datenbankmanagementsystem (DBMS) MySQL verwaltet wird.

    num, image, name

    Das sieht das zum Beispiel so aus,

    1 | aaa.jpg | John
    2 | bbb.jpg | Doe
    3 | ccc.jpg | Jane
    4 | ddd.jpg | Doe

    Nun würde ich gerne mit PHP die Zeilen Schrittweise oder einzeln ausgeben. Sol heissen, ich würde gerne mit PHP Zeile 1, 3, 6 und 10 ausgeben. Wie mache ich das?

    Es gibt keine Zeilen 1, 3, 6, 10. Jedenfalls nicht in dem Sinne, den Du vielleicht meinst. In welcher Reihenfolge das DBMS die Zeilen einer Tabelle speichert ist völlig unwichtig. Wenn Du eine bestimmte Reihenfolge haben möchtest, dann musst Du nach einem Kriterium sortieren.

    Möchtest Du Datensätze, die einen bestimmten Wert in einer Spalte, z.B. der Spalte "num" haben, dann gibst Du diese Kriterien in der WHERE-Klausel Deiner SELECT-Anweisung an. Möchtest Du z.B. die Datensätze, die in "num" die Werte 1, 3, 6 und 10 haben und aufateigend nach den Werten in "num" sortiert, so lautete Deine SQL-Anweisung:

    SELECT                      -- Gib mir die Werte der Spalten  
        num,                    -- num,  
        image,                  -- image und  
        name                    -- name  
    FROM tabelle                -- aus meiner Tabelle  
    WHERE                       -- wobei mich nur die Datensätze interessieren,  
        num IN (1, 3, 6, 10)    -- bei denen num die Werte 1, 3, 6 oder 10 annimmt  
    ORDER BY                    -- Sortiere die Ergebnismenge nach den Werten  
        num                     -- der Spalte num
    

    Wie Du mit PHP diese Abfrage an das DBMS übermitteln, anschließend die von MySQL zurückgelieferten Daten entgegennehmen und weiterverarbeiten kannst, das steht in den entsprechenden Handbuchabschnitten von PHP. Ich empfehle Dir, entweder die verbesserte MySQL-Erweiterung (ignoriere die Warnung, die deutsche Doku ist hier schrecklich veraltet) oder gleich PDO zu verwenden.

    Freundliche Grüße

    Vinzenz