En términos generales, es correcto: Se necesita cruzar todas las tablas para obtener esa información porque tienes tres parámetros repartidos en tres tablas distintas, y lo que quieres conseguir está en la cuarta.
En estas situaciones la cosa se resuelve mayormente con la creación de vistas (VIEW), que son tablas virtuales basadas en una consulta estandarizada, y que a los efectos de la performance son mucho más funcionales.
En tu caso sería así:
Código MySQL:
Ver originalFROM TA.tabla_anuncio
, MC.marca
, MO.modelo
, TC.ciudades
INNER JOIN tabla_ciudad TC
ON TA.id_ciudad
= TC.id_ciudad
INNER JOIN marca_coche MC
ON TC.id_ciudad
= MC.id_ciudad
INNER JOIN modelo_coche MO
ON MC.id_modelo
= MO.id_modelo
;
Usando una vista definida más o menos así, para obtener lo que deseas simplemente sería:
Ten en cuenta que la vista debe responder a una consulta genérica, no debe incluir los valores a buscados. Esos se usan cuando realizas la consulta a la vista.