select distinct pa.attribute_id , pa.text from product_attribute pa, product_category pb
where p.product_id = pa.product_id and p.category_id=8 and
pa.product_id not in (
select pa2.product_id from product_attribute pa2
where (pa2.attribute_id=9 and pa2.text=92) or (pa2.attribute_id=8 and pa2.text=55)
) and
not((pa.attribute_id=9 and pa.text=92) or (pa.attribute_id=8 and pa.text=55))
Выражения по типу (pa.attribute_id=9 and pa.text=92) or (pa.attribute_id=8 and pa.text=55) надо формировать динамически или
Создать третью таблицу filtr_sess (sid, attribute_id, text) куда перед вызовом закидывать текущую сессию + выбранные атрибуты. Тогда вызов можно осуществлять только по Sid-у и Category_Id.
Примерно так (пишу без доступа к СУБД с чужого ПК, прошу не винить в синтаксисе):
select distinct pa.attribute_id , pa.text from product_attribute pa, product_category pb, filtr_sess fs
where p.product_id = pa.product_id and p.category_id=8 and
pa.product_id not in (
select pa2.product_id from product_attribute pa2, filtr_sess s
where (pa2.attribute_id=s.id and pa2.text=s.text and s.sid=X)
) and fs.sid=X and pa.attribute_id <> fs.id and pa.text <> fs.text