Зависит от того, хотите ли вы, чтобы ваши атрибуты были специфичными для продукта, но, очевидно, нет. Кроме того, вам не нужен product_id в таблице значений, если он есть в таблице атрибутов. Так что ваши таблицы имеют больше смысла, если они похожи на:
table categories:
-id
-category
table products:
-id
-product
-price
-image
-category_id
table attributes:
-id
-attribute
-product_id
table values:
-attribute_id
-value
На самом деле, я бы сделал это намного проще EAV:
table categories:
-id
-category
table products:
-id
-product
-price
-image
-category_id
table attributes:
-id
-product_id
-attribute
-value
И тогда ваш запрос будет выглядеть так:
SELECT id, product, price, image, attribute, value
FROM products
INNER JOIN attributes ON products.id = attributes.product_id
WHERE products.category_id = :category_id
Убедитесь, что у вас есть соответствующие индексы. Кроме того, то, как вы хотели это сделать, выбрав идентификаторы продуктов и затем поместив их в IN, является плохой практикой.