forse... e dico forse... così ho risolto
SELECT *
FROM (
SELECT annunci.titolo , annunci.settore, annunci.id AS id_ann, pubblicazioni.id AS id_pubb, categorie.id AS id_cat,
categorie.nome_ita AS categoria, tipologie.id AS id_tip, tipologie.nome_ita AS tipologia, annunci.marca,
annunci.modello, annunci.importo, pubblicazioni.stato
FROM (categorie INNER JOIN tipologie ON categorie.id=tipologie.id_categoria)
INNER JOIN (annunci INNER JOIN pubblicazioni ON annunci.id=pubblicazioni.id_annuncio)
ON tipologie.id=annunci.id_tipologia
WHERE ( ((pubblicazioni.stato) LIKE '%' ) AND ((annunci.id_utente)=3))
) AS primatb
INNER JOIN
(SELECT MAX(pubblicazioni.data_inizio) As data_inizio, MAX(pubblicazioni.id) As id, pubblicazioni.id_annuncio
FROM pubblicazioni
GROUP BY pubblicazioni.id_annuncio) AS tmptb
ON primatb.id_pubb=tmptb.id
ORDER BY primatb.id_tip, tmptb.data_inizio DESC, primatb.marca, primatb.modello
LIMIT 0,20