Vinzenz Mai: Php & Mysql, Zeilen Schrittweise ausgeben

Beitrag lesen

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