Насколько это круто?
SELECT seq.`id` FROM (
SELECT @row := @row + 1 as `id`
FROM `users` t, (SELECT @row := 0) r
CROSS JOIN `users` t2
) as seq WHERE seq.`id` NOT IN (SELECT `id` FROM `users`)
AND seq.`id` <= (SELECT max(`id`) from `users`);
Если вы хотите пропустить идентификаторы для аналитических целей, полюбите это:
SELECT CONCAT(dt.missing, IF(dt.`found`-1 > dt.missing, CONCAT(' to ', dt.`found` - 1), '')) AS missing
FROM ( SELECT @rownum:=@rownum+1 AS `missing`,
IF (@rownum=id, 0, @rownum:=id) AS `found`
FROM ( SELECT @rownum:=0 ) AS r
JOIN users
ORDER BY id ) AS dt
WHERE dt.`found`!= 0;