Gracias GikaJavi. Si que había 3 registros por consulta.
He intentado reescribir el código por completo y se ha solucionado, pero no tengo muy claro porqué o cual era el fallo. Este fue el resultado por si a alguien le sirve:
$query = "SELECT category_id FROM post2cat WHERE post_id='$id'";
$result = mysql_query ($query);
while ($cat_id_array = mysql_fetch_array($result)){
$cat_id = $cat_id_array ["category_id"];
$query = "SELECT cat_name FROM categories WHERE cat_ID='$cat_id'";
$result2 = mysql_query($query);
$cat_name_array = mysql_fetch_array($result2);
$cat_name_temp = $cat_name_array[0];
$cat_name = $cat_name." ".$cat_name_temp;
}