Si vos données ne sont pas trop volumineuses, vous pouvez utiliser cette astuce dans MySQL :
select user_id, max(dte),
substring_index(group_concat(place_visited order by cnt desc), ',', 1)
from (select user_id, place_visited, count(*) as cnt, max(recorded_date) as dte
from user_places
group by user_id, place_visited
) upv
group by user_id;