|
|
|
| Структура таблиц:
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 средних числа (среднее) их складываю и делю пополам
Результат получается неверный результат отличается в сотых долях.
В чем может быть ошибка? | |
|
|
|
|
|
|
|
для: 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%
какие уж тут сотые доли. | |
|
|
|
|
|
|
|
для: Trianon
(27.11.2008 в 11:57)
| | Так как сделать по уму. Я понял, что не прав. Помогите с запросами | |
|
|
|
|
|
|
|
для: mihdan
(27.11.2008 в 13:10)
| | Вместо AVG вытаскивайте отдельно SUM и COUNT, отдельно для first_mark и для second_mark
Раздельно складываете суммы и количества.
Затем делите одно на другое. | |
|
|
|
|
|
|
|
для: 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 в формате через запятую,
чтобы отказаться от цикла. Чтот никогда об этом не думал? | |
|
|
|
|
|
|
|
для: 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}'
|
| |
|
|
|
|
|
|
|
для: Trianon
(27.11.2008 в 18:46)
| | Trianon как всегда на высоте-благодарствую, облегчили мне жизнь. Ушел читать мануал по SQL, в частности про JOIN'ы | |
|
|
|
|
|
|
|
для: Trianon
(27.11.2008 в 18:46)
| | up | |
|
|
|
|
|
|
|
для: mihdan
(04.12.2008 в 17:06)
| | Аллах акбар! | |
|
|
|
|
|
|
|
для: mihdan
(27.11.2008 в 17:46)
| | SELECT GROUP_CONCAT(`id`) ... | |
|
|
|
|
|
|
|
для: BinLaden
(27.11.2008 в 18:48)
| | Спасибо. Это понятно. | |
|
|
|