SQL,如何不计算0值

时间:2012-05-03 19:04:00

标签: php mysql

我正在尝试使用此代码查找总投票,我有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用于测试目的。 table example

4 个答案:

答案 0 :(得分:0)

尝试使用HAVING子句:

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

答案 1 :(得分: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与语言障碍结合使得它们留空)。最后,将空白移到中间会很好,因为你应该有足够的数据来说明并获得一个标准偏差和其他更有价值的统计数据,而不是依赖于平均值(少数差评可以甩掉整条曲线)。

答案 2 :(得分:0)

添加到查询的末尾:

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

答案 3 :(得分: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");