santissimi ... che confusione.

Primo: se un campo e' un varchar mettere != 0 non ha molto senso. significa dire "diverso da ascii 48 decimale. il che potrebbe pure funzionare ma manca il senso logico.

Poi dovresti "farti" la cortesia di cambiare il nome $numrows per il result set. Siccome lo utilizzi prima per:

$numrows = mysql_num_rows($result);

non dovrebbe essere un grosso impegno chiamare per esempio $row il result set....

while ($row = mysql_fetch_assoc($result)) {

Almeno si sgombra lo scenario da equivoci che ingenuamente potrebbero incorrere a chi legge.

Altra cosa relativa ad un campo varchar. Il campo puo' assumere tre diversi, chiamiamoli per semplicita', "stati".

1) campo NULL - cioe' NON esiste e non viene considerato nei raggruppamenti.
2) campo vuoto, empty - Esiste ma non ha valori di alcun genere.
3) campo valorizzato. - esiste ed e' diverso da "vuoto" e NULL.

Poi una domanda: i tre campi delle tre tabelle devono essere tutti vuoti/pieni oppure e' ammesso che se almeno uno esiste lo puoi stampare? In ogni caso il link da stampare lo devi scegliere con il where nella query e non con un controllo sul contenuto a posteriori.