Uno dei problemi potrebbe essere l'ordine delle if. Per quanto ne so, quando l'interprete trova la prima soluzione soddisfacente esce dalla struttura delle else e ignora il resto. Io farei:
<?php if (isset($_GET['tipologia']) AND (isset($_GET['regione']))) { $annunci=mysql_query("SELECT * FROM annunci WHERE tipologia='$_GET[tipologia]' AND regione='$_GET[regione]' ORDER BY id DESC"); } // se l'utente seleziona solo la tipologia else if (isset($_GET['tipologia'])) { $annunci=mysql_query("SELECT * FROM annunci WHERE tipologia='$_GET[tipologia]' ORDER BY id DESC"); } // se l'utente seleziona solo la regione else if (isset($_GET['regione'])) { $annunci=mysql_query("SELECT * FROM annunci WHERE regione='$_GET[regione]' ORDER BY id DESC"); } // se non è stato selezionato niente, seleziona tutti gli annunci else { $annunci=mysql_query("SELECT * FROM annunci ORDER BY id DESC"); } $tot=mysql_num_rows($annunci); if ($tot==0) { echo " <div class=\"alert alert-info\"> <i class=\"icon-info-sign\"></i> Spiacente, non ci sono annunci con i criteri selezionati! </div> "; } else { while ($row_show=@mysql_fetch_assoc($annunci)) { [...] omissis [...]Ma va provato.