0

我正在尝试使用此代码查找总票数,我有 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 票。每列类别名称:comfort + service + ambience,是一个列 id,该字段的条目为 1 票,它将 12 计为 1 票,如果您为 1 个标准投票,则其他 11 个为 0,并返回错误结果,因为除以 2 将是正确答案的一半

出于测试目的,我上传了一个可视化示例并将评分列从 12 缩短到 7。 表格示例

4

4 回答 4

0

添加到查询的末尾:

HAVING comfort + service + ambience + mood + spacious + experience + cleanliness+ price + drinks + food + music + toilets != 0
于 2012-05-03T19:30:01.473 回答
0

尝试使用 HAVING 子句:

select
...
from
...
where
...
having COUNT(shop_id) > 0
于 2012-05-03T19:26:36.880 回答
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,并且在统计中会导致误导性数据(认为挂乍得结合语言障碍,所以他们把它留空)。最后,

于 2012-05-03T19:29:12.837 回答
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");
于 2012-05-03T19:58:07.310 回答