Я бы порекомендовал следующее:
- используйте
left outer join
, чтобы получить анекдоты без рейтинга
- используйте
avg()
вместо вычисления среднего вручную
- возможно использовать
coalesce()
, чтобы избежать null
значений в результате
Вот упрощенная версия ваших таблиц:
create table joke(jokeid int primary key, jokedata varchar(50));
create table ratings(rating int, relative_id int);
insert into joke values(1, "killing");
insert into joke values(2, "no rating");
insert into ratings values(5, 1);
insert into ratings values(10, 1);
И некоторые примеры запросов:
select joke.jokeid, avg(ratings.rating) as average
from joke
left outer join ratings
on ratings.relative_id = joke.jokeid
group by joke.jokeid;
+--------+---------+
| jokeid | average |
+--------+---------+
| 1 | 7.5000 |
| 2 | NULL |
+--------+---------+
Или, используя coalesce()
:
select joke.jokeid, avg(coalesce(ratings.rating, 0)) as average
from joke
left outer join ratings
on ratings.relative_id = joke.jokeid
group by joke.jokeid;
+--------+---------+
| jokeid | average |
+--------+---------+
| 1 | 7.5000 |
| 2 | 0.0000 |
+--------+---------+