I found this answer in How to find gaps in sequential numbering in mysql? and found it really does the trick (adapted for your purpose):
SELECT
CONCAT(z.expected, IF(z.got-1>z.expected, CONCAT(' thru ',z.got-1), '')) AS missing
FROM (
SELECT
@rownum:=@rownum+1 AS expected,
IF(@rownum=table_products.product_id, 0, @rownum:=table_products.product_id) AS got
FROM
(SELECT @rownum:=0) AS a
JOIN table_products
ORDER BY table_products.product_id
) AS z
WHERE z.got!=0;
Hope this does the job for you. The only thing it does not do is stop at a particular product_id, but I assume you can look at the result and take the data that you need.