Подсчет количества значений по каждому признаку

Рейтинг: -1Ответов: 1Опубликовано: 02.05.2015

Существует следующий алгоритм:

$bd = mysql_query("SELECT * FROM list GROUP BY class");
while ($myrow = mysql_fetch_assoc($bd))
{
    $res = $myrow['class'];
    $lec = 0; $sem = 0; $lab = 0;
    $bd2 = mysql_query("SELECT * FROM list WHERE class='$res'");
    while ($myrow2 = mysql_fetch_assoc($bd2))
    {

        $type = $myrow2['type']; 
        if($type == 'Лекция') {
            $lec = $lec + $myrow2['count_hours'];
            echo $lec.' часов ';
        }

        if($type == 'Семинар') {
            $sem = $sem + $myrow2['count_hours'];
            echo $sem.' часов ';
        }

         if($type == 'Лабораторная') {
            $lab = $lab + $myrow2['count_hours'];
            echo $lab.' часов ';
        }
        echo $res = $myrow2['class'].' ';
        echo $type = $myrow2['type'].' ';
        echo $rest = $myrow2['discipline']."<br>";

    }
}

Он подсчитывает суммирует часы по всем предметам одной группы. А как сделать так, чтобы он суммировал часы по каждому предмету каждой группы? Предметы получается нужно как то разделить. Как то реализовать через if else? Поместить блок с расчетом в оператор if else, и чтоб он проверял старое значение с новым. В случае если предметы не совпадают, то обнулять переменные и делать подсчет заново. Как так на практике реализовать....

Результат работы алгоритма:

введите сюда описание изображения

P.S. Через агрегатные функции реализовать не получается. http://sqlfiddle.com/#!9/726d9/4/0

Ответы

▲ 1

С данным "алгоритмом" работать в принципе нельзя. Поскольку из всех сгруппированных строк он будет возвращать только одну, причем случайную.

При использовании GROUP BY вычисления надо производить в самом запросе, и выбирать только те поля, которые при группировке являются уникальными. То есть, запрос вида SELECT * FROM ... GROUP BY в принципе не имеет смысла. Тогда уж лучше возвращайся к своему полному перебору таблицы - это будет хоть и криво, но хотя бы данные будут верны.