perché stai usando HAVING ... a causa del fatto che la tua query non utilizza la funzione aggregata in modo da poter filtrare dove (ma dove non lo usi devi ripetere il codice) e per le prestazioni usando dove evita una scansione completa per aumentare il risultato per avere valutazione
$query = $mysqli->query("SELECT postcode, (
6371 * acos (
cos ( radians('$latitude') )
* cos( radians( lat ) )
* cos( radians( lng ) - radians('$longitude') )
+ sin ( radians('$latitude') )
* sin( radians( lat ) )
)
) AS distance
FROM postcodetabel
WHERE 6371 * acos (
cos ( radians('$latitude') )
* cos( radians( lat ) )
* cos( radians( lng ) - radians('$longitude') )
+ sin ( radians('$latitude') )
* sin( radians( lat ) ) )< 12
ORDER BY distance ASC");