Jeśli twoje dane nie są zbyt duże, możesz użyć tej sztuczki w 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;