Рейтинг с кол-вом проголосовавших пользователей

(Ответов: 7, Просмотров: 622)
  1. Дипломник
    • Регистрация: 13.11.2013
    • Сообщений: 158
    • Репутация: 4
    • Webmoney BL: ?
    Добрый вечер. Хотя нет. Когда в городе разрываются снаряды, он совсем не добрый. Ну да ладно...
    Пытаюсь создать скрипт который выведет количество оценок от 1 до 10 с результатами голосов каждой.
    Т.е.

    Оценка 10 - 5 пользователей.
    Оценка 9 - 0 пользователей.
    Оценка 8 - 4 пользователей.
    и т.д.

    Потратил сутки на казалось-бы простой вопрос но....

    PHP код:
    $query "SELECT COUNT(*) as count_rate,rating FROM " "$config_ccms_prefix"game_rate WHERE w_id=\"$gameid\"";
            
            
    $r mysql_query($query) or die($query." : ".mysql_error());    
            
    $result mysql_fetch_array($r);    
            
    $rate_sum 0;
            
    $rate_count 0;
            
    $rate_statis = array(10=>0,9=>0,8=>0,7=>0,6=>0,5=>0,4=>0,3=>0,2=>0,1=>0);
            for(
    $i 0$i 10$i ++) {
                if (isset ( 
    $result [$i] )) {
                    
    $rate_sum += $result [$i]->count_rate $result [$i]->rating;
                    
    $rate_count += $result [$i]->count_rate;
                    
    $rate_statis [intval $result [$i]->rating )] = $result [$i]->rating;
                }
            }
            
    $rate_avg $rate_count == $rate_sum $rate_count;
            
    $data_star = array ();
            foreach ( 
    $rate_statis as $k => $v ) {
                
    $data_star [] = "{$k}=" number_format $v0'.''.' ) . "";
            }
            
            
    var_dump($data_star); 
    Результат никак не могу получить. Прошу помощи профессионалов.
    • 0
  2. Дипломник
    • Регистрация: 13.11.2013
    • Сообщений: 158
    • Репутация: 4
    • Webmoney BL: ?
    Появились сдвиги...

    PHP код:
    $query "SELECT rating, COUNT(*) AS votes 
                        FROM " 
    "$config_ccms_prefix"game_rate WHERE w_id=\"$gameid\" GROUP BY rating ORDER BY rating DESC";
                
    $result mysql_query($query) or die($query." : ".mysql_error());
                
                while(
    $row mysql_fetch_assoc($result)) 
                {    
                    
                 
                    
    $ratings_detail .= "".$row['rating']." (votes ".$row['votes'].")""<hr>";
                                    
                } 
    Код начал выводить существующие оценки.
    т.е. если существует запись в бд оценки 10,9,5...
    Но как заставить выполнить перебор значений от 0 до 10 хз.
    • 0
  3. Дипломник
    • Регистрация: 10.07.2011
    • Сообщений: 149
    • Репутация: 23
    Вроде надо что-то типа count (rating) без группировки
    • 0
  4. Дипломник
    • Регистрация: 13.11.2013
    • Сообщений: 158
    • Репутация: 4
    • Webmoney BL: ?
    mln141, пробовал не то. Думаю что смотреть надо в сторону for чтобы проходил все значения, но реализовать с моим уровнем знаний не получается.
    • 0
  5. Дипломник Аватар для ekart
    • Регистрация: 02.01.2010
    • Сообщений: 162
    • Репутация: 44
    • Webmoney BL: ?
    Добрый вечер. Хотя нет. Когда в городе разрываются снаряды, он совсем не добрый. Ну да ладно...
    Привет, waterfly Кто не сдается, тот побеждает. ) Показал пост боссу. Шеф сказал: Помочь! Уже дали задачку нашим программистам. Это тяжелая артиллерия. Минут 10-15 подождите. Сейчас разберутся с вашим кодом.

    ---------- Сообщение добавлено 15:48 ---------- Предыдущее 15:38 ----------

    Пробуйте.
    1-й вариант. Использовать заранее созданный массив с нулями по всем голосам.
    PHP код:
    $query "SELECT rating, COUNT(rating) AS votes FROM ".$config_ccms_prefix."game_rate WHERE w_id=".$gameid." GROUP BY rating";
    $result mysql_query($query);
    $array array_fill(1100);
    while(
    $row mysql_fetch_assoc($result)) {    
    $array[(int)$row['rating']] = $row['votes'];
    }

    $ratings_detail "";
    for (
    $i 1$i <= 10$i ++) {
    $ratings_detail .= $i." (votes ".$array[$i].")<hr>";

    2-й вариант. Создать временную таблицу в запросе.

    PHP код:
    $query "SELECT tmp.rating, count(gr.rating) AS votes FROM 
    (SELECT 1 AS rating 
    UNION SELECT 2 
    UNION SELECT 3 
    UNION SELECT 4 
    UNION SELECT 5 
    UNION SELECT 6 
    UNION SELECT 7 
    UNION SELECT 8 
    UNION SELECT 9 
    UNION SELECT 10) AS tmp 
    LEFT JOIN "
    .$config_ccms_prefix."game_rate AS gr 
    ON gr.rating=tmp.rating 
    WHERE gr.w_id="
    .$gameid.
    GROUP BY tmp.rating"
    ;
     
    $result mysql_query($query);
    $ratings_detail "";
    while(
    $row mysql_fetch_assoc($result)) {    
    $ratings_detail .= $row['rating']." (votes ".$row['votes'].")<hr>";

    3-й вариант. Использовать не временную таблицу, а постоянную.

    ---------- Сообщение добавлено 16:12 ---------- Предыдущее 15:48 ----------

    Вдогонку

    Там суть в том что у него в БД нет значений, и группируя результат SQL, запросе он считывает только то что у него там есть. А если рейтинга вообще нет, даже нет значения 0, то он из БД не выведет список от 0-10
    [16:08:33] Артём: Поэтому надо создавать виртуально в памяти список от 0-10
    • 1

    Спасибо сказали:

    waterfly(15.09.2014),
  6. Дипломник
    • Регистрация: 13.11.2013
    • Сообщений: 158
    • Репутация: 4
    • Webmoney BL: ?
    ekart, спасибо. Под утро уже психонул и сделал по одному запросу для каждой оценки. На конкурсе говнокода я бы занял первое место)) Начинаю пробовать Ваши варианты.
    • 1

    Спасибо сказали:

    ekart(15.09.2014),
  7. Дипломник Аватар для ekart
    • Регистрация: 02.01.2010
    • Сообщений: 162
    • Репутация: 44
    • Webmoney BL: ?
    Всё получится )
    • 0
  8. Дипломник
    • Регистрация: 13.11.2013
    • Сообщений: 158
    • Репутация: 4
    • Webmoney BL: ?
    ekart, большое спасибо. Была добавлена процентная шкала. В которой пришлось поставить условие, т.к. делилась ноль при отсутствии голосов. Может есть более элегантное решение?

    PHP код:
    $query "SELECT rating, COUNT(rating) AS votes FROM ".$config_ccms_prefix."game_rate WHERE w_id=".$gameid." GROUP BY rating";
    $result mysql_query($query);
    $array array_fill(1100);
    while(
    $row mysql_fetch_assoc($result)) {    
    $array[(int)$row['rating']] = $row['votes'];
    }
    $ratings_detail "";
    for (
    $i 1$i <= 10$i ++) {
    if (
    $total_votes 0) {$percentage round($array[$i] / $total_votes 100);}
    $ratings_detail .= "<li class=\"breakdown-score__row\"><span class=\"col-score\">".$i."<span> (".$array[$i].")</span></span><span class=\"col-bar\"><div class=\"progress progress--dark progress-small\"><div class=\"bar\" style='width:".($percentage*2)."%'></div></div></span></li>";

    Итоговый вариант:
    Нажмите на изображение для увеличения.  Название:	??? ?????-1.jpg  Просмотров:	5  Размер:	24.7 Кб  ID:	15565

    К слову как помять числовую ориентацию/направленность от 10 до 1 сверху вниз?)))
    • 0

Похожие темы

Темы Раздел Ответов Последний пост
Рейтинг
Google 3 24.06.2013 02:38
Рейтинг в DLE
DLE 8 09.06.2013 16:26
Рейтинг пользователей в Community Builder
Joomla 0 03.06.2012 05:01
Русский рейтинг пользователей Twitter - iFollow.ru
Реклама партнерских программ 10 24.06.2011 23:24

У кого попросить инвайт?

Вы можете попросить инвайт у любого модератора:

Информеры