(PHP ve mysqli kullanarak) sonuçlarının bir çift sayıya bir MySQL sorgusu sınırlayın

8 Cevap php

Ben bir MySQL veritabanı sonuçlarının bir çift sayı dönmek gerekiyor PHP kodu biraz var. Ben sorguyu yürütmek için mysqli uzantısı kullanıyorum.

Benim kod şu anda yaklaşık olarak şudur:

//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
}

Gördüğünüz gibi, ben 6 satır sorgu sınırlama var, ancak bazı koşullarda, az iade edilecektir. Sadece 3 satır döndürülür varsa, ben son satırı atmak ve sadece 2 tutmak istiyorum.

MySQL sorgu veya mysli ben bunu nasıl yapabilirim?

Şimdiden teşekkürler.

8 Cevap

Böyle bir şey hayal ediyorum:

// 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;
    }
}

Ben muhtemelen oldukça SQL yerine, PHP bu yapardı. while-döngü içinde, bir sayaç tutmak ve döngü çıkmak zaman karşı olmadığını kontrol edin. Bu tuhaf, son yinelemenin sonuçlarını atmak.

Başka bir seçenek COUNT soran ve sonuca göre sorguyu değiştirmek olduğunu:

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

Ben bir PHP kişi değilim (onun ben ona baktım yıllar oldu) ama ....

Ross bunu bahseder ama kullanmak istediğiniz

$result->num_rows

Bazı bir şekilde döngü içinde bu satırların eşit sayıda tutmak için sonuçları işler.

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

Sayaç $ maxResults aynı olduğunda, döngü patlak.

Benim cevabım muhtemelen iyi olmasa da, mysql sadece, ama belki biraz serin. :-)

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;

Adımlar:

  1. Ilk ifadede i gerçekten @ sayısı değişkeninde var kaç sonuç koydu
  2. Düzensiz ise ikinci açıklamada i biriyle değişken azaltma
  3. Sorgunuzla deyimi hazırlamak ve sınırı için yer tutucu
  4. Bebeği yürütmek
  5. Bunun gerekli olup olmadığını ayırması, bilmiyorum

Ama kim bu php çözümleri sonra belki daha hızlı olduğunu, bilir ...

Basit yolu sadece bir anda satırları iki kapmak olacaktır:

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

(PHP kişi, ancak kargo-culting diğer cevaplardan sözdizimi değil ...)

Sharkey,

Sizin çözüm mükemmel çalışacaktır ancak sözdizimi biraz değiştirmek gerekir. Aşağıya bakın.

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

Bir diğer yol da ikinci sıra ilk satırı iptal edecek ve ilk göstermez. Şimdi, bu sonuçları hem de gösterecektir. Güzel basit bir çözüm, MEZUNLARI.