You’ve aliased the table and column as the same thing, so don’t do that. It’s not invalid, just tough to follow.
Anyway, include all columns that you’re selecting that aren’t aggregates in your group by:
select
count(w.id) as mycount,
w.company_id,
c.company_name,
c.city
from
companies c
left join workers w on
c.id=w.company_id
group by
w.company_id,
c.company_name,
c.city
order by mycount desc;