2012-05-03 46 views
0

正在嘗試使用此代碼找到總投票數,我有12個條件; 因此,我們將每個SHOP_ID的TOTAL加起來除以12(總共使用的列數)。 COUNT(shop_id)查找店鋪數量,例如,如果我有2個shop_id輸入,其中一個總共爲0(12個條目爲0),另一個總數爲60,除以12個條件,然後除以shop_id count 2 (60/12)/ 2 = 2.5 我希望結果爲5.有些如何不在分區中計算列的0。SQL,如何不計數0值

$sel = mysql_query("SELECT SUM(comfort + service + ambience + mood + spacious + 

    experience + cleanliness+ price + drinks + food + music + toilets)/(12/COUNT(shop_id) as total     
    FROM ratings   
    WHERE shop_id = $shop_id");     

if(mysql_num_rows($sel) > 0){ 
    while($data = mysql_fetch_assoc($sel)){ 
     $total = $total + $data['total']; 
     $rows++; 
    } 
    $perc = ($total/$rows); 
    return round($perc,2); 
} else { 
    return '0'; 
} 

如果我提供一個圖像,以便直觀地顯示試圖實現什麼,會更好嗎?

每行不是1票,每個shop_id是12票。 每列類別名稱:comfort + service + ambience,是一個列ID,並且該字段的條目是1票,它將12列爲1票,如果您爲1條條件投票,其他11條爲0,並返回錯誤的結果,除以2將正確答案的一半

我已經上傳了一個可視化的例子,並縮短了從12到7的評級列出於測試目的。 table example

+0

怎麼樣使用'COUNT(*)'。 – Niranjan

回答

0

嘗試使用HAVING子句:

select 
... 
from 
... 
where 
... 
having COUNT(shop_id) > 0 
+0

謝謝,但沒有成功。我認爲我在做什麼不對從這裏開始 – Renai

0
SELECT SUM(comfort + service + ambience + mood + spacious + 
experience + cleanliness+ price + drinks + food + music + toilets)/(12/COUNT(shop_id) as total     
FROM ratings   
WHERE shop_id = $shop_id 
HAVING total > 0 

我敢肯定你的查詢是不完全正確,但可能是一個錯字。

這裏可能是一個更好的查詢:

SELECT shop_id, SUM(comfort + service + ambience + mood + spacious + 
experience + cleanliness+ price + drinks + food + music + toilets)/12 as total_rating     
FROM ratings   
GROUP BY shop_id 
HAVING total > 0 

我個人認爲,如果有人越來越全線0的,這是值得注意的,但上面的應該給你單店的平均評分並過濾掉任何不是至少爲1.

如果每個類別都是從0到5的等級,並且有12個類別,這意味着他們的百分比分數是(單個分數的總和)/(可能的總數)* 100 ,或者,在這種情況下,單個得分/ .6的總和(按照相同的方式)。如果你想要一個「星級評定」,其中星星的數量等於每個類別的最高分數,那只是平均數。在那種情況下,我會舍入到小數點後一位。所以,如果你想要去的路線,這裏是查詢,我會用:

SELECT shop_id, 
      Ceiling(
       Sum(comfort + service + ambience + mood + spacious + 
         experience + cleanliness + price + 
         drinks + food + music + toilets 
      ) /. 6) 
      AS percent_rating, 
      ROUND(
      SUM(
       comfort + service + ambience + mood + 
       spacious + experience + cleanliness + 
       price + drinks + food + music + toilets 
      )/12, 1) 
      as star_rating 
    FROM ratings 
    GROUP BY shop_id 

現在,如果你想擁有它奠定了每個得分滿分爲100%,那麼這將是(cat_score/5)* 100或(cat_score/.05)。我不確定是否有一種簡單的方法可以適用於所有的類別,而不必爲每個領域明確地進行數學運算,但是我真的不認爲你需要費力去弄清楚4/5是80%。

至於默認的0與有意的0相比,你無法知道差異。如果有人感覺不夠從0(或空白)改變它,它肯定不會那麼棒。最好的辦法是將默認值設置爲中間值(3),如果實際上它很差,那麼大多數人會將其標記爲較低。同樣,如果您給出將其留空的選項(它不是0,它是NULL),那麼你可以將它移動到3(它的工作原理是相同的,如果它們全部留空,就如同說「平均我沒有填寫它」一樣),或者你可以使它成爲一些數字認爲是公平的(可能是1或2),把它扔出去會讓人痛苦,並且在統計數據中會導致誤導性數據(認爲懸掛乍得與語言障礙結合在一起,使它們保持空白)。最後,將空白移動到中間位置將會很好,因爲在完成所有步驟並獲得標準偏差和其他更有價值的統計數據時,您應該擁有足夠的數據,而不是依賴於簡單的平均數(少數不良評論可能會拋出關閉整條曲線)。

+0

請問哪裏是錯字? – Renai

+0

'/(12/COUNT(shop_id)'你不需要第一個括號內的標記或者末尾沒有你想要的標記。 – Anthony

+0

絕對結束,我打算用於TOTAL/12然後除以2 = 2.5 但是我開始意識到其他方面的問題我試圖做到這一點 – Renai

0

添加到您的查詢的末尾:

HAVING comfort + service + ambience + mood + spacious + experience + cleanliness+ price + drinks + food + music + toilets != 0 
+0

謝謝,但沒有成功: mysql_num_rows():提供的參數不是有效的MySQL結果資源 – Renai

+0

然後查詢失敗並返回false,請使用'mysql_error()'來查看錯誤。 – Ing

0

您的查詢是不完全正確。它缺少一個括號。

正確的:

$sel = mysql_query("SELECT SUM(comfort + service + ambience + mood + spacious + 
experience + cleanliness+ price + drinks + food + music +toilets)/(12/COUNT(shop_id)) 
as total FROM ratings WHERE shop_id = $shop_id having COUNT(shop_id) > 0"); 
+0

謝謝,但我有更多的錯誤比我的查詢由事物的外觀 – Renai