Frage

Ich habe ein bisschen von PHP-Code, die ich brauche eine gerade Anzahl von Ergebnissen aus einer MySQL-Datenbank zurück. Ich bin die mysqli-Erweiterung mit meiner Abfrage auszuführen.

Mein Code ist etwa das im Moment:

//assume we already have a database connection

$query = "SELECT id 
            FROM movies 
           WHERE publish = 1
             AND showimage = 1
        ORDER BY date DESC
           LIMIT 6";

$result = $connection->query($query);

while ($row = $result->fetch_assoc()) {
    //do some stuff
}

Wie Sie sehen können, bin ich die Begrenzung der Abfrage zu 6 Zeilen, aber in einigen Bedingungen wird weniger zurückgegeben werden. Wenn nur drei Zeilen zurückgegeben werden, möchte ich die letzte Zeile wegzuwerfen und nur 2 zu halten.

Wie kann ich tun dies in der MySQL-Abfrage oder in MySQLi?

War es hilfreich?

Lösung

ich so etwas wie das vorstellen würde:

// row counter
$counter = 1;
// loop through each row
while($row = $result->fetch_assoc()) {
    // If there is more than one row remaining 
    // OR if the current row can be divided by two
    if (($result->num_rows - $counter) > 1 || ($counter % 2)) {
        // result code for even rows
        $counter++;
    } else {
        // break out of the loop
        break;
    }
}

Andere Tipps

Ich würde wahrscheinlich tun dies in PHP, anstatt SQL. Im while-Schleife, hält einen Zähler, und wenn Sie aus der Schleife zu erhalten, prüfen Sie, ob der Zähler. Wenn es seltsam ist, werfen die Ergebnisse der letzten Iteration entfernt.

Eine weitere Möglichkeit für eine COUNT bittet und ändern Sie die Abfrage nach dem Ergebnis:

SELECT COUNT(*) FROM movies WHERE publish = 1 AND showimage = 1

Ich bin kein PHP Person (seine seit Jahren, seit ich es sah), aber ....

Ross erwähnt es aber Sie verwenden möchten

$result->num_rows

in irgendeiner Art und Weise innerhalb der Schleife, die die Ergebnisse verarbeitet eine gerade Anzahl von Reihen zu halten.

$ maxResults = $ result-> num_rows; if (($ maxResults% 2) = 1) $ MaxResults -;

Wenn der Zähler gleich wie $ maxResults ist, bricht aus der Schleife.

Meine Antwort ist mysql nur, wenn auch wahrscheinlich nicht die beste, aber vielleicht irgendwie cool. : -)

SELECT size INTO @count FROM (SELECT COUNT(*) as size FROM (SELECT * FROM table LIMIT 6) l) t;
SET @count = @count - (@count % 2);
PREPARE stmt_limit FROM 'SELECT * FROM table LIMIT ?';
EXECUTE stmt_limit USING @count;
DEALLOCATE PREPARE stmt_limit;

Schritte:

  1. In der ersten Anweisung i setzen, wie viele Ergebnisse, die Sie wirklich in der @count Variable haben
  2. In der zweiten Anweisung dekrementieren i die Variable mit einem, wenn es uneben
  3. Bereiten Anweisung mit Ihrer Anfrage und Platzhalter für Limit
  4. Führen Sie das Baby
  5. Ausplanen, weiß nicht, ob dies notwendig ist

Aber wer weiß, das ist vielleicht schneller als die PHP-Lösungen ...

Der einfachste Weg wäre, nur die Zeilen zwei auf einmal greifen:

while($row1 = $result->fetch_assoc() && $row2 = $result->fetch_assoc()) {
    do_something_with($row1);
    do_something_with($row2);
}

(keine PHP Person, aber cargo-culting die Syntax aus den anderen Antworten ...)

Sharkey,

Ihre Lösung funktioniert perfekt, aber Sie müssen die Syntax ein wenig ändern. Siehe unten.

while(($row1 = $result->fetch_assoc()) && ($row2 = $result->fetch_assoc()))
{ 
    do_something_with($row1); 
    do_something_with($row2); 
} 

Der andere Weg, um Ihre zweite Reihe wird die erste Zeile zunichte machen und die ersten nicht zeigen. Jetzt wird es beiden Ergebnisse angezeigt werden. Schöne einfache Lösung, BTW.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top