Something along these lines will work:
SELECT id, name, category
FROM (
SELECT *,
IF( @prev <> category,
@rownum := 1,
@rownum := @rownum+1
) AS rank,
@prev := category,
@rownum
FROM (
SELECT * FROM products
ORDER BY category, rand()
) random_prodcts
) products_ranked
WHERE rank <= 2;
It orders them randomly within the categories, then pulls them out tracking how many it's got from each.
Not sure how nicely it will scale though.
EDIT: Tried it with a few thousand records and it seems ok.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…