... where roles_routes.access in (select access from roles_routes where role_id=1)
Судя по этому куску получаются грабли... Я обычно сначала делаю запрос, чтобы получить access, а потом уже, имея точное и четкое значение, задаю запрос на список. То есть что-то вроде этого:
SELECT `access`,`другое_нужное_поле` FROM `roles_routes` WHERE `role_id`=1
и потом
SELECT * FROM `roles` LEFT JOIN `roles_routes` ON `roles.id` = `roles_routes`.`role_id` WHERE `roles_routes`.`access`=`результат_первого_запроса`.`access` OR (`roles_routes`.`access`>`результат_первого_запроса`.`access` AND `roles_routes`.`нужное_поле`=`результат_первого_запроса`.`другое_нужное_поле`)
но я все это делаю в PHP, поэтому и значения могу из первого запроса подставлять как угодно...