This is one of those places where MySQL's lack of subqueries really scr*ws you.
WHen you are selecting the products to display, you'd normally do:
SELECT *
FROM products
LIMIT foo,bar;
Now you have a table that holds all the product-id's of those products that are not available, so you could just substract those from the products table using a subquery.... in any database except mysql.
This will not work in mysql:
SELECT *
FROM products
WHERE productid NOT IN (SELECT productid FROM hold)
ORDER BY productid
LIMIT foo,bar;
But it does get the point across: you have to find a way to skip all those products in 'products' whose ID is already in 'hold'.
In other words, you want to display all those products that don't appear in 'hold'. And in MySQL that can be done using a LEFT JOIN.
LEFT JOIN will merge two tables, and if the second table does not have an entry to match the ON clause, then NULL's are used instead, and these NULL can be noticed:
SELECT *
FROM products LEFT JOIN hold ON products.productid = hold.productid
WHERE hold.productid IS NULL
ORDER BY products.productid
LIMIT foo,bar;