2010-03-22 119 views
2

我正在使用MVC與PHP/MySQL。MySQL:只獲得結果集計數

假設我使用了10個不同查詢的函數來從數據庫中獲取細節。
但在其他時間,我可能只想獲得將由查詢返回的結果的計數。
什麼是處理這種情況的標準方法。
我應該寫10個函數來重複幾乎整個查詢並只返回計數。
或者
我應該也總是返回計數與結果集
或者
我可以通過一個標誌,表明該函數應返回只計數,然後根據該標誌,我會動態地生成(選擇部分的)查詢。

有沒有更好的方法?

回答

1

如果您只想要符合特定條件的行數,則不應使用結果計數,而應使用僅選擇計數(*)的另一個查詢。

如果你需要這兩個數據,它的數量,爲什麼你不使用count()結果數組?

另一種方法是使用一些class可以返回數據和它的計數,但不是每個10個查詢不同的類,而是一個單一的數據庫訪問類。

0

我通常會盡量在方法之間共享盡可能多的代碼。一個可能性是:

  • 有一個select()和一個count()功能
    • 每一個構建查詢的特定部分
  • ,並建立查詢的部分之一buildFromAndWhere()功能這是常見的。
    • ,並有select()count()使用一個


寫的僞代碼,它可能看起來有點像這樣:

function select($params) { 
    return "select * " 
      . from() 
      . where($params) 
      . "limit 0, 10"; 
} 

function count() { 
    return "count(*) as nbr " 
      . from() 
      . where(); 
} 

function from() { 
    return "from table1 inner join table1 on ... "; 
} 

function where($params) { 
    // Use $params to build the where clause 
    return "where X=Y and Z=blah"; 
} 

這樣一來,你有在from()where()函數中儘可能多的通用代碼 - 考慮部分查詢往往存在,它是最好的。


我更喜歡有兩個單獨的函數來選擇和計數;我認爲它使代碼更易於閱讀和理解。

我不喜歡一種方法返回兩個不同數據的想法(結果列表和總數);我也不太喜歡傳遞一個標誌的想法:看看這個函數的調用,你永遠不會知道這個參數意味着什麼。

1

我會用旗幟的想法。

寫入10個函數和複製/粘貼代碼根本無助於可讀性。如果您總是返回計數,那意味着只要您只對計數感興趣,數據庫仍然必須生成並傳輸完整的結果集,這可能是非常低效的。

旗,你就必須像

function getData($countOnly=false) { 
    // ...generate FROM and WHERE clause 
    if ($countOnly) { 
     $query = 'SELECT COUNT(*) '.$query; 
    } else { 
     $query = 'SELECT field1, field2, ...'.$query.' ORDER BY ...'; 
    } 
    ... 
} 
2

現在,MySQL支持的子查詢,你可以使用獲得任何查詢計數:

$count_query="SELECT COUNT(*) FROM ($query)"; 

有多難呢?但是這種方法總是意味着你正在運行兩個查詢,而不是隻運行一個查詢(我不確定MySQL是否必須能夠使用一個緩存結果集來計數 - 試試看看)。

如果您已經提取了整個結果集,它可能會更快地計算PHP中的行,而不是發出另一個查詢。

有2個功能中的MySQL這將之前的限制聲明的應用返回匹配的行數:

SQL_CALC_FOUND_ROWS和FOUND_ROWS()

看到

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

Ç 。