Eseguire una query per ogni categoria trovata nella prima query, è uno spreco di accessi MySQL e quindi di risorse.
Usa una join tra le due tabelle e tira fuori subito tutti i risultati con una sola query:
Codice PHP:
$query = "SELECT categorie.id AS id, categorie.nome AS nome, count(*) as tot FROM categorie, articoli WHERE categorie.id = articoli.categoria GROUP BY categorie.nome ORDER BY categorie.nome";
$result = mysql_query($query);
while ($echo = mysql_fetch_assoc($result))
{
echo "<a href=index.php?cat=" . $echo['id'] . ">" . $echo['nome'] . "(" . $echo['tot'] . ")</a><br />";
}
E come hai visto, non ho usato '*' nella SELECT, ma ho nominato soltanto quei campi che mi servono. Anche questa è buona usanza, e nel caso di join tra tabelle evita problemi se ci sono campi con lo stesso nome nelle diverse tabelle.