2010-09-08 22 views
1

我已經寫了一個代碼,我經常跳到數據庫有點尷尬,我使用代碼來計算評論表中批准,待處理和垃圾郵件的數量。如何改進此代碼以使我的代碼更少地訪問數據庫?

這是我的代碼。

$query_approved = "SELECT COUNT(*) as approved FROM comments WHERE approve = '1'"; 
$result_approved = mysql_query($query_approved); 
$row_approved = mysql_fetch_array($result_approved); 
$query_unapproved = "SELECT COUNT(*) as unapproved FROM comments WHERE approve = '0'"; 
$result_unapproved = mysql_query($query_unapproved); 
$row_unapproved = mysql_fetch_array($result_unapproved); 
$query_spam = "SELECT COUNT(*) as spam FROM comments WHERE spam = '1'"; 
$result_spam = mysql_query($query_spam); 
$row_spam = mysql_fetch_array($result_spam); 

雖然該代碼工作正常,但它看起來很醜。無論如何要改善?

回答

2

使用:

SELECT SUM(CASE WHEN c.approved = '1' THEN 1 ELSE 0 END) AS cnt_approved, 
     SUM(CASE WHEN c.approved = '0' THEN 1 ELSE 0 END) AS cnt_unapproved, 
     SUM(CASE WHEN c.spam = '1' THEN 1 ELSE 0 END) AS cnt_spam 
    FROM COMMENTS c 
+0

到底什麼是c? – 2010-09-08 18:05:09

+0

@Ibrahim Azhar Armar:這是一個表別名。不需要單個表格,但是我是在習慣之外做的,所以我知道什麼是列和什麼表與函數等。 – 2010-09-08 18:10:16

+0

我測試了人們所提出的所有查詢,而我發現的最可行的解決方案是你的,它的工作沒有任何問題。和別名是我發現玩的東西。謝謝你的回答。我將與您的代碼:) – 2010-09-08 18:17:19

1

您可以結合:

SELECT SUM(approve) as approved, SUM(spam) AS spam, 
    SUM(approved) - COUNT(*) as unapproved 
FROM comments 

縱觀前三的答案(包括本),我倚向Kelsey的做法是最mantainable。

+1

你如何得出結論:同一張桌子上的三個單獨的傳球更容易維護? – 2010-09-08 17:51:06

+0

因爲我一讀完就明白它在做什麼,而你和我的需要思考;我的是因爲SUM()技巧,因爲SUM()和CASE()。當然,你的**效率最高。 – egrunin 2010-09-08 19:01:43

0

您可以優化前兩個呼叫一個電話

$query_approved = "SELECT COUNT(*) as totalCount , approve as status FROM comments group by approve"; 
$result_approved = mysql_query($query_approved); 
$rows = mysql_fetch_array($result_approved); 
foreach($rows as $row) 
{ 
    if($row['status'] == '1') 
    { 
      $row_approved = $row['totalCount']; 
    } 
    elseif ($row['status'] == '0') 
    { 
      $row_unapproved = $row['totalCount']; 
    } 
} 

$query_spam = "SELECT COUNT(*) as spam FROM comments WHERE spam = '1'"; 
$result_spam = mysql_query($query_spam); 
$row_spam = mysql_fetch_array($result_spam); 
0

更有效的單個查詢可能是:

$SQL = "SELECT approve, spam, count(*) as cnt FROM comments GROUP BY approve, spam"; 
$result_approved = mysql_query($SQL); 
$rows= mysql_fetch_row($result_approved); 

然後,您可以將的foreach $行...

foreach ($rows as $row) { 
    $row[0] is the approved code (1 or 0) 
    $row[1] is the spam flag (1 or 0) 
    $row[2] is the count for this criteria 
} 

您最終將得到4行,每個批准的是垃圾郵件,而不是垃圾郵件,未批准爲垃圾郵件並且不是垃圾郵件。