2013-01-18 47 views
1

我正在轉換一箇舊的mysql_X站點與PDO一起工作,到目前爲止,這麼好(我認爲)。然而,我對計算查詢結果的可靠性有疑問。使用count()來計算來自PHP中PDO的結果?

目前,我就擁有了一切準備像這樣(我已經刪除了try/catch語句錯誤代碼,以使這更易於閱讀):

$stm = $db->prepare("SELECT COUNT(*) FROM table WHERE somevar = '1'"); 
$stm->execute(); 
$count = $stm->fetchColumn(); 

if ($count > 0){ 
    $stm = $db->prepare("SELECT * FROM table WHERE somevar = '1'"); 
    $stm->execute(); 
    $result = $stm->fetchAll(); 
} 

有可能是愚蠢的問題,做這種方式,我邀請你告訴我是否有,但我的問題是關於減少數據庫查詢。我注意到,如果我先刪除第一條語句,然後單獨運行第二條語句,然後使用PHP的count()來計算結果,但我似乎仍然得到可靠的行數,只有一個查詢,如下所示:

$stm = $db->prepare("SELECT * FROM table WHERE somevar = '1'"); 
$stm->execute(); 
$result = $stm->fetchAll(); 

$count = count($result); 
if ($count > 0){ 
    //do whatever 
} 

這樣做有沒有什麼陷阱呢?它可靠嗎?我的PDO有沒有明顯的錯誤?謝謝您的幫助!

+0

您是否試過'num_rows'? – Kermit

+0

我還沒有試過num_rows。我已經嘗試過rowCount,它也可以工作,但我已經讀過,不建議在SELECT查詢中使用它,因爲結果可能並不總是可靠的。 – Marty

回答

2

在MySQL中進行計數是可取的,特別是如果計數值是您感興趣的唯一結果。請將您的版本與同等問題「雜貨店有多少巧克力棒存貨?」進行比較。在db

1)計算:SELECT count(*) ....開車去商店,算上巧克力棒,記下號碼,開車回家,閱讀次數了你的論文

2)在PHP數:SELECT * ...。開車去商店。買所有的巧克力棒。把他們運回家。在你的客廳地板上數一數。將結果寫在一張紙上。 扔掉巧克力棒。從紙上讀取數字。

哪一種效率更高/成本更低?沒有什麼大不了的,如果你的db/table只有幾條記錄。當你開始達到數千/數百萬條記錄時,版本2)絕對是可笑的,可能會耗盡你的帶寬,炸掉你的PHP內存限制,並將你的CPU使用率推到平流層。

這就是說,運行兩個查詢沒有意義,一個只計算您可以獲得多少條記錄。這樣的系統很容易受到競爭條件的影響。例如你做你的計數,並得到(說)1條記錄。當你去運行第二個查詢並獲取該記錄時,其他一些並行進程已經結束並插入另一個記錄,或者刪除了你想要的那個記錄。

+0

我估計會有一個點,它會更有意義做計數的MySQL。在這種情況下,我正在使用的表格現在只有13個參賽作品,並且長時間不會變得非常大。在這種情況下,它也給我有用搶在一旦所有的結果 - 我會抓住反正他們所有,所以它不是一個巨大的損害服務器的兩種方式。 – Marty

+0

這是一個很好的觀察,雖然,我想我得記住這一點,因爲我有在具有更多的條目同一個數據庫的另一個表,而我將不得不限制使用更嚴格。謝謝! – Marty

0

在第一種情況下,您使用MYSQL計數,第二種情況下您使用PHP計數。兩者都是相同的結果。

+0

是的,我意識到這一點。也許是有速度的權衡那裏,我沒有考慮到的畫面......但現在,我在確保我得到可靠的結果,並限制數據庫的查詢數量最感興趣時,我可以。 – Marty

+0

@Marty如果你只需要顯示計數那麼MySQL的方式最好是在速度方面,因爲你不必再抓住所有的行知數。但是,如果你要顯示他們都那麼PHP的方式是更好的,因爲你沒有運行2個查詢 –

+0

我都數不過來,然後在這種情況下顯示結果,所以我認爲這可能是最好在這裏使用PHP的計數。感謝您的反饋! – Marty

0

您對查詢的用法是正確的。當您使用LIMIT時,唯一的問題就會出現,因爲COUNT(*)和count($ result)將會不同。

COUNT(*)將計算該查詢將返回(假定計數查詢是相同的,而不是用LIMIT)

計數($結果)的所有行會算剛剛返回的行,所以如果你使用LIMIT,你只會得到結果達到給定的極限。

+0

如果在兩個查詢中都使用LIMIT,結果將仍然相同。 –

+0

這就是爲什麼我說:「考慮到計數查詢是相同的,而不是使用LIMIT」 –

0

是的,它在這個用例中是可靠的!