2 Stimmen

Begrenzung einer MySQL-Abfrage auf eine gerade Anzahl von Ergebnissen

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

Mein Code sieht im Moment ungefähr so aus:

//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, beschränke ich die Abfrage auf 6 Zeilen, aber unter bestimmten Bedingungen werden weniger Zeilen zurückgegeben. Wenn nur 3 Zeilen zurückgegeben werden, möchte ich die letzte Zeile wegwerfen und nur 2 behalten.

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

1voto

Sander Versluys Punkte 69607

Meine Antwort ist nur mysql, obwohl 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 gebe ich in die Variable @count ein, wie viele Ergebnisse Sie wirklich erhalten haben
  2. In der zweiten Anweisung dekrementiere ich die Variable um eins, wenn sie ungerade ist
  3. Prepare-Anweisung mit Ihrer Abfrage und Platzhalter für Limit
  4. Das Baby exekutieren
  5. Zuweisung aufheben, weiß nicht, ob dies notwendig ist

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

1voto

NickZoic Punkte 7157

Am einfachsten wäre es, wenn Sie die Zeilen jeweils zu zweit nehmen würden:

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

(Ich bin kein PHP-Experte, aber ich habe die Syntax aus den anderen Antworten übernommen ...)

1voto

Eric Punkte 11

Sharkey,

Ihre Lösung wird perfekt funktionieren, 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); 
} 

Andernfalls hebt die zweite Zeile die erste Zeile auf und zeigt die erste nicht an. Jetzt werden beide Ergebnisse angezeigt. Schöne einfache Lösung, BTW.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X