Toda vez que você chama
mysql_fetch_array
ele puxa a próxima linha da sua consulta. Que while
loop continua retornando true enquanto o mysql_fetch_array
ainda tem algo para atribuir à variável $row2
. Uma vez que está fora das linhas, não tem mais nada para dar à variável e false é retornado. ETA: Em relação ao último bit que você mencionou, você pode ter um incremento de variável em cada iteração do loop como no seu exemplo, mas não é totalmente necessário. Você também pode ver quantas linhas foram retornadas fazendo algo como
$var = mysql_num_rows($data)
antes do seu while
laço.