Если вы используете MySQL 8.0, вы можете использовать оконные функции. avg()
приходит на ум:
select a.*, avg(b.flag) over(partition by a.canon_id) ratio
from table_a a
left join table_b b on b.user_id = a.user_id
В более ранних версиях коррелированный подзапрос мог бы быть приемлемым решением:
select
a.*,
(
select avg(b1.flag)
from table_a a1
left join table_b b1 on b1.user_id = b.user_id
where a1.canon_id = a.canon_id
) ratio
from table_a a