Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Точность функции AVG()
 
 автор: mihdan   (27.11.2008 в 11:43)   письмо автору
 
 

Структура таблиц:

games - игры

id | name | seazon | .... | first | second


first - первый помощник судьи (id_user)
second - второй помощник судьи(id_user)

first-marks - оценки первого помощника за конкретную игру

id | id_game | mark (поле типа float)


second-marks - оценки второго помощника за конкретную игру? анологичная структура

Как посчитать среднюю оценку за сезон человека когда он был первым или вторым помощником,
зная id_user


Делаю так выбираю из games id игр за данный сезон по данному юзеру(id_user). Заношу id в
переменную $ids через запятую (id1, id2, ...., idN)

Вторым запросом считаю среднюю оценку

SELECT AVG(`mark`) AS `test` FROM `first-marks` WHERE `id_game` IN ($ids)


Повторяю действие для второго помощника.

В итоге получается 2 средних числа (среднее) их складываю и делю пополам
Результат получается неверный результат отличается в сотых долях.

В чем может быть ошибка?

  Ответить  
 
 автор: Trianon   (27.11.2008 в 11:57)   письмо автору
 
   для: mihdan   (27.11.2008 в 11:43)
 

представьте себе выборку 5 5 5 для first и 1 для second
avg(5,5,5,1) = 16/4 = 4
а Вы считаете его так: avg(avg(5,5,5), avg(1)) = avg(15/3, 1) = avg(5, 1) = 6/2 = 3

Ошибка в 25%

какие уж тут сотые доли.

  Ответить  
 
 автор: mihdan   (27.11.2008 в 13:10)   письмо автору
 
   для: Trianon   (27.11.2008 в 11:57)
 

Так как сделать по уму. Я понял, что не прав. Помогите с запросами

  Ответить  
 
 автор: Trianon   (27.11.2008 в 14:19)   письмо автору
 
   для: mihdan   (27.11.2008 в 13:10)
 

Вместо AVG вытаскивайте отдельно SUM и COUNT, отдельно для first_mark и для second_mark
Раздельно складываете суммы и количества.
Затем делите одно на другое.

  Ответить  
 
 автор: mihdan   (27.11.2008 в 17:46)   письмо автору
 
   для: Trianon   (27.11.2008 в 14:19)
 

Спасибо. Все верно работает. Только вот запросов многовато, нельзя ли оптимизировать?

Офтоп:

Использую запрос для получения id:


<?php
$sql 
"SELECT    `id`
    FROM    `games`
    WHERE    `season`='
${Aseason}'
    AND        `competition`='
${Acomp}'
    AND        `helper_first`='
${id}'
"
;
$exec mysql_query($sql);
if (
mysql_num_rows($exec) > 0) {
    while(
$row mysql_fetch_assoc($exec)) {
        
$idsA[] = $row['id'];
    }
    
$ids implode(','$idsA);
}
?> 


Можно ли прямо в запросе (думаю что можно) получить $ids в формате через запятую,
чтобы отказаться от цикла. Чтот никогда об этом не думал?

  Ответить  
 
 автор: Trianon   (27.11.2008 в 18:46)   письмо автору
 
   для: mihdan   (27.11.2008 в 17:46)
 

SELECT    SUM(mark) AS sm1, COUNT(mark) AS cm1 FROM 
    FROM    `games` AS g JOIN  `first-marks` AS m ON m.id_game=g.id 
    WHERE    `season`='${Aseason}'
    AND        `competition`='${Acomp}'
    AND        `helper_first`='${id}'


SELECT    SUM(mark) AS sm2, COUNT(mark) AS cm2 FROM 
    FROM    `games` AS g JOIN  `second-marks` AS m ON m.id_game=g.id 
    WHERE    `season`='${Aseason}'
    AND        `competition`='${Acomp}'
    AND        `helper_second`='${id}'

  Ответить  
 
 автор: mihdan   (28.11.2008 в 00:11)   письмо автору
 
   для: Trianon   (27.11.2008 в 18:46)
 

Trianon как всегда на высоте-благодарствую, облегчили мне жизнь. Ушел читать мануал по SQL, в частности про JOIN'ы

  Ответить  
 
 автор: mihdan   (04.12.2008 в 17:06)   письмо автору
 
   для: Trianon   (27.11.2008 в 18:46)
 

up

  Ответить  
 
 автор: BinLaden   (05.12.2008 в 18:19)   письмо автору
 
   для: mihdan   (04.12.2008 в 17:06)
 

Аллах акбар!

  Ответить  
 
 автор: BinLaden   (27.11.2008 в 18:48)   письмо автору
 
   для: mihdan   (27.11.2008 в 17:46)
 

SELECT GROUP_CONCAT(`id`) ...

  Ответить  
 
 автор: mihdan   (28.11.2008 в 00:09)   письмо автору
 
   для: BinLaden   (27.11.2008 в 18:48)
 

Спасибо. Это понятно.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования