2014-03-13 59 views
0

我有8個不同的產品類別的數據庫下載。我如何簡化這個PHP的MySQL計數代碼並減少查詢?

pic, app, ebo, tem, des, cod, mus, cat 

我想統計每個產品類別的客戶端總下載量和總下載量。 類別產品的最大每日下載限額爲3. 用戶登錄時應該看看剩餘下載量。 這裏是工作的代碼

$query = "SELECT COUNT(*) as sum FROM service_downloads where client_id like '$client'"; 
$result = mysql_query($query) or die(mysql_error()); 
// Print out result 
while($row = mysql_fetch_array($result)) 
{ 
echo "You have downloaded". $row['sum'] ." products."; 
echo "<br />"; 
} 
$query = "SELECT COUNT(*) as sum FROM service_downloads where client_id like '$client' and product like 'pic'"; 
$result = mysql_query($query) or die(mysql_error()); 

// Print out result 
while($row = mysql_fetch_array($result)) 
{ 
echo "". $row['sum'] ." downloaded pictures"; 
$leftovers = 3 - $row['sum']; 
echo " $leftovers pictures remain for download"; 
echo "<br />"; 
} 
$query = "SELECT COUNT(*) as sum FROM service_downloads where client_id like '$client' and product like 'app'"; 
$result = mysql_query($query) or die(mysql_error()); 

// Print out result 
while($row = mysql_fetch_array($result)) 
{ 
echo "". $row['sum'] ."downloaded applications"; 
$leftovers = 3 - $row['sum']; 
echo " $leftovers applications remain for download."; 
echo "<br />"; 
} 

$query = "SELECT CO.... This procedure repeat eight times for different product category. 

結果

You have downloaded 12 products. 

3 downloaded pictures 0 pictures remain for download. 

1 downloaded applications 2 applications remain for download. 

3 downl....... 
+0

您可以使用'GROUP BY'讓每一個計數單個查詢中的單個類別。然後總和就是把所有這些加在一起,所以你真的不需要去查詢。 –

+0

'SELECT product,count(1)AS sum FROM service_downloads GROUP BY product' –

回答

0
$query = "SELECT COUNT(*) as sum,product FROM service_downloads where client_id like '$client' GROUP BY product"; 
$result = mysql_query($query) or die(mysql_error()); 
// Print out result 
while($row = mysql_fetch_array($result)) 
{ 
echo "You have downloaded". $row['sum'] ." ".$row['product']; 
echo "<br />"; 
} 

這應該工作

0

你應該擊穿每個類別的下載量在一個查詢數量:

SELECT product,COUNT(*) 
FROM service_downloads 
WHERE client_id like '$client'; 

我也不認爲你需要使用LIKE;你可能想使用=

0

你可以得到一個結果,在所有的款項與此查詢設置。

SELECT COUNT(*) as sum, product 
    FROM service_downloads 
WHERE client_id = '$client' 
    AND PRODUCT IN ('pic', 'app', 'abc', 'def', 'ghi') 
GROUP BY product WITH ROLLUP 
ORDER BY product NULLS FIRST 

這會給你一個行對每個特定的產品,並在產品列中的NULL值的彙總(彙總)一行。

如果這個查詢需要很長時間在(client, product上創建一個索引),它應該會非常快。

0

如果您經常顯示這些數據,這聽起來像什麼,那麼您應該有一個單獨的表來表示這些SUM,並且是由CLIENT_ID索引的。

然後,您可以在每次添加新條目時增加/減少該值。

例如,當您添加一個新行service_downloads在「知情同意」的CLIENT_ID 1項,那麼你也會增加此快捷方式表:

UPDATE service_counts SET pic=pic+1 WHERE client_id=1; 
1

你可以使用一個GROUP BY語句分組你的結果。

SELECT COUNT(`Product`) AS `Sum`, `Product` 
FROM  `service_downloads` 
WHERE `client_id` = '<client_id>' 
GROUP BY `Product` 

然後你可以使用一個while語句來遍歷每個產品:

// Print out result 
while($row = mysql_fetch_array($result)) 
{ 
    echo "". $row['Sum'] ."downloaded " . $row['Product']; 
    $leftovers = 3 - $row['Sum']; 
    echo " $leftovers " . $row['Product'] . " remain for download."; 
    echo "<br />"; 
}