You're dropping the first result, obviously enough - you set the value of $row to the first result, and if it's nonempty, you immediately set it again to the second.
I don't know why this idiom is used so often. I generally use:
$result_rows=mysql_num_rows($result);
if($result_rows!=0)
{
echo "<table>...";
for($i=0;$i<$result_rows;++$i){
$row=mysql_fetch_array($result);
...
}
}
The for loop can be replaced by the same old while() loop as before if ypu wish.