Es como dice naciostars, me meto solamente para responder a tu pregunta con una explicación.
La función
mysql_num_rows() carga en una variable una fila del resultado y automáticamente avanza una posición, de modo que si la ejecutamos nuevamente devolverá la próxima fila.
Al utilizarla como condición del if, la función se ejecuta para realizar la comparación. Como da verdadero (y está negado) pasa al else y ejecuta el while, pero ya se ha hecho una ejecución dentro del if, por lo tanto el while arrancará de la segunda fila.
Saludos!