2009-01-17 99 views
1

我有一些PHP代碼,我需要從MySQL數據庫返回偶數個結果。我使用mysqli擴展來執行我的查詢。將MySQL查詢限制爲偶數個結果(使用PHP和mysqli)

我的代碼大約是這樣的時刻:

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

正如你所看到的,我限制查詢到6行,但在某些情況下,將返回較少。如果只返回3行,我想扔掉最後一行,只保留2.

如何在MySQL查詢或mysli中執行此操作?

在此先感謝。

回答

5

我想像這樣的事情

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

難道你不能只彈出最後一個? 我只是查了一下,PHP有一個函數「array_pop」。 我不是一個PHP程序員,但我想必須有一個長度函數和一個模運算符。 – nasmorn 2011-12-21 21:54:24

5

我可能會這樣做在PHP中,而不是SQL。在while -loop中,保留一個計數器,當你退出循環時,檢查計數器。如果很奇怪,扔掉最後一次迭代的結果。根據結果​​

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

另一種選擇是要求一個COUNT並改變查詢:

2

我不是一個PHP的人(它已經過去幾年了,因爲我已經看過它)但是...

羅斯提到它但你想要使用

$result->num_rows 

以某種方式在您的循環中處理結果以保持偶數行。

2

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

當計數器與$ maxResults相同時,跳出循環。

1

我的答案只有mysql,雖然可能不是最好的,但也許有點酷。 :-)

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; 

步驟:

  1. 在第一條語句我把多少結果你在@count可變
  2. 真的得在第二條語句我遞減變量與一個如果它是不均勻
  3. 準備語句查詢和佔位符的限制
  4. 執行寶寶
  5. 取消分配,做不知道這是否是必要的

但誰知道,這可能是更快的PHP解決方案...

1

最簡單的方法是隻搶行每次兩個:

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

(不是一個PHP的人,但貨物culting從其他的答案語法...)

1

Sharkey,

您的解決方案將完美工作,但您需要稍微修改語法。見下文。

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

另一種方式你的第二行將取消第一行,不會顯示第一行。現在它將顯示兩個結果。很好的簡單解決方案,BTW。