MySQL "Limit" clause grabbing more results than requested
This is happening because the LIMIT clause is in a subquery.

To fix it, move it to the end:

SELECT A.username, A.points
FROM users A
INNER JOIN ( 
   SELECT points
   FROM users
   WHERE points &lt;&gt; 0
   ORDER BY points DESC
)B
USING (points)
LIMIT $start, $limit


I suspect you'll also want to move the ORDER BY.