0

このコードを使用して総投票数を見つけようとしています。12 の基準があります。したがって、各 SHOP_ID の TOTAL を合計し、12 (合計を作成するために使用される列の量) で割ります。COUNT(shop_id) はショップの数を見つけます。たとえば、2 つの shop_id 入力がある場合、1 つは合計 0 (0 の 12 エントリ) で、もう 1 つは合計 60 で、12 の基準で割ってから shop_id カウントで割ったものです。 of 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 票です。1 つの基準に投票した場合、他の 11 が 0 である場合、12 を 1 票としてカウントし、間違った結果を返します結果、2 で割ると正解の半分になるため

視覚的な例をアップロードし、テスト目的で評価列を 12 から 7 に短縮しました。 テーブルの例

4

4 に答える 4

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 だった場合、それを低く評価します。それは NULL です)、それを 3 に移動することができます (これは同じように機能します。彼らがすべて空白のままにした場合、それは「平均なので、私は記入しなかった」と言っているのと同じです)、またはあなたがそれをいくつかの数字にすることができます。公正だと思います (おそらく 1 または 2 です). それを捨てるのは mysql の苦痛であり、統計では誤解を招くデータにつながります (ぶら下がっているチャドを言葉の壁と組み合わせて空白のままにしたと考えてください). 最終的に,

于 2012-05-03T19:29:12.837 に答える
0

クエリの最後に追加します。

HAVING comfort + service + ambience + mood + spacious + experience + cleanliness+ price + drinks + food + music + toilets != 0
于 2012-05-03T19:30:01.473 に答える
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 に答える