2015-06-19 67 views
0

我想知道如何使用LIMITSELECT FOUND_ROWS()包含到現有查詢中,或者如果有更好的方法可以獲得總行數而不需要LIMITmysqli - 使用SELECT FOUND_ROWS()和預處理語句

//SELECT * just for question 

$q = $this->db->mysqli->prepare("SELECT SQL_CALC_FOUND_ROWS * 
           FROM countries_ship c 
           JOIN items i 
           ON c.item_id = i.id 
           JOIN item_expire e 
           ON c.item_id = e.item_id 
           JOIN users u 
           ON i.user_id = u.id 
           LEFT JOIN bids b 
           ON i.id = b.item_id 
           LEFT JOIN publishers p 
           ON i.item_publisher = p.id 
           LEFT JOIN tags_rel tr 
           ON c.item_id = tr.item_id 
           JOIN tags t 
           ON t.id = tr.tag_id 
           LEFT JOIN countries co 
           ON i.item_location = co.id 
           WHERE ".$where." 
      GROUP BY i.id ORDER BY ".$order." ".$limit.""); 

    $count_rows = $this->db->mysqli->query("SELECT FOUND_ROWS()"); 

/* return of var_dump($count_rows); 
object(mysqli_result)#74 (5) { 
    ["current_field"]=> 
    int(0) 
    ["field_count"]=> 
    int(1) 
    ["lengths"]=> 
    NULL 
    ["num_rows"]=> 
    int(1) 
    ["type"]=> 
    int(0) 
} 
*/ 

$prep = join("", $prep); 

    call_user_func_array('mysqli_stmt_bind_param', array_merge (array($q, $prep), $this->helperClass->valRef($ref))); 

    $q->execute(); 
    $rows = $this->helperClass->bindResults($q); 

    $q->close(); 

    return $rows; 

不知道這是否100%有效,但這是我如何解決我的問題。

  1. 改變了查詢開始SELECT SQL_CALC_FOUND_ROWS
  2. 創建新的陣列 - $resArray = array()
  3. 移動的第二查詢類似建議,並添加這兩種結果$resArray

     $q->execute(); 
    
         $rows = $this->helperClass->bindResults($q); 
    
         $q->close(); 
    
         $count_rows = $this->db->mysqli->query("SELECT FOUND_ROWS()"); 
    
         $count = mysqli_fetch_assoc($count_rows); 
    
         $resArray[] = $count; 
         $resArray[] = $rows; 
    
         return $resArray; 
    
+0

select count(*)as total_item from ... –

+0

不會只是返回帶有限制的計數嗎? – Ciprian

+1

就像您通常那樣:將'SQL_CALC_FOUND_ROWS'添加到您的'SELECT'併發出第二個查詢來獲得結果。 – jeroen

回答

0

您的SQL_CALC_FOUND_ROWS正處於正確的軌道上,您只需要移動到執行查詢以計算結果的位置。因爲它只會在運行原始查詢後纔有效。 因此,將$count_rows = $this->db->mysqli->query("SELECT FOUND_ROWS()");移至$q->execute();之後

+0

'致命錯誤:未捕獲的異常'mysqli_sql_exception'帶有消息'Commands out of sync;在'$ q-> execute()'之後移動'$ count_rows'後,你不能立即運行這個命令。所以我把它移到'$ rows = $ this-> helperClass'之後...但'var_dump'結果仍然相同。 – Ciprian

1

雖然我可能是錯的,看來,如果你只是想獲得那些符合條件的行數,你應該只使用SQL的計數聚合函數是這樣的:

SELECT 
    i.id, 
    count(*) 
FROM 
    countries_ship c 
     JOIN items i 
      ON c.item_id = i.id 
     JOIN item_expire e 
      ON c.item_id = e.item_id 
     JOIN users u 
      ON i.user_id = u.id 
     LEFT JOIN bids b 
      ON i.id = b.item_id 
     LEFT JOIN publishers p 
      ON i.item_publisher = p.id 
     LEFT JOIN tags_rel tr 
      ON c.item_id = tr.item_id 
     JOIN tags t 
      ON t.id = tr.tag_id 
     LEFT JOIN countries co 
      ON i.item_location = co.id 
WHERE 
    ".$where." 
GROUP BY 
    i.id 

另一方面,如果你想獲得一個計數和所有細節的方式,你可以將它們分頁,最好是簡單地運行兩個查詢 - 一個用於聚合計數,另一個用於限制結果。

編輯:我已經在查詢中留下了i.id分組,因爲它會給你一個計數每i.id匹配的行。如果你只想完全計算TOTAL,你可以將它從select子句和group by中刪除,完全擺脫組。

+0

是的...我需要獲取詳細信息,將行限制爲12並計算所有行沒有限制。而且我還需要將「COUNT(b.bids)」出價計爲出價。這就是爲什麼我使用'GROUP BY' – Ciprian

相關問題