[英]SQL , how not to count 0 values
我正在嘗試使用此代碼進行總投票,我有12條條件; 因此,將每個SHOP_ID的TOTAL加起來,然后除以12(用於總計的列數)。 COUNT(shop_id)查找商店的數量,因此,例如,如果我有2個shop_id輸入,一個輸入總計為0(12個條目為0),另一個總計60,該數量除以12個條件,然后除以shop_id計數的2(60/12)/ 2 = 2.5我希望結果為5。有些方法不計算除法中的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票。 每個列類別名稱:舒適性+服務+環境,是列ID,並且該字段中的條目為1票,它將12計為1票,如果您對1個條件投票,則其他11則為0,並返回錯誤結果,除以2將得到正確答案的一半
我已經上傳了一個直觀的示例,出於測試目的,將評分列從12縮短為7。
嘗試使用HAVING子句:
select
...
from
...
where
...
having COUNT(shop_id) > 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,大多數人會將此值標記為較低。類似地,如果您將其保留為空白(不為0,它為NULL),那么您可以將其移至3(效果相同。如果他們都將其留為空白,這與說“所以平均而言我沒有填寫”)相同,也可以將其設為一個數字認為是公平的(可能是1或2),將其扔掉是一個痛苦的mysql,並且在統計信息中會導致誤導性數據(認為將chad與語言障礙相結合,因此將它們留為空白)。最后,將空白移到中間會很好的,因為說了算,您應該有足夠的數據來獲取標准偏差和其他更有價值的統計信息,而不是依賴於簡單的平均數(在這里,一些糟糕的評論可能會拖垮整個曲線)。
添加到查詢的末尾:
HAVING comfort + service + ambience + mood + spacious + experience + cleanliness+ price + drinks + food + music + toilets != 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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.