Несколько COUNT() + JOIN = одинаковые значения?
Попробуйте COUNT(DISTINCT r.id).
Ну так при JOIN, строк то и там и там одинаковое, значит COUNT работает правильно.

Нужно сделать 2 подзапроса отдельно к каждой таблице в этом участке кода COUNT(`r`.`id`) AS `rcnt`. Ну если я правильно понял задачу.