Я изменил запрос. Это должно быть то, что вы основали на своих обновлениях:
SELECT attribute.name AS attributename, COUNT(*) AS numofproducts FROM product
INNER JOIN attribute2product ON attribute2product.productid = product.id
INNER JOIN attribute ON attribute.id = attribute2product.attributeid
WHERE product.id IN
(
SELECT p.id FROM product AS p
INNER JOIN attribute2product AS a2p ON a2p.productid = p.id
WHERE a2p.attributeid = 2
)
GROUP BY attribute.id, attribute.name;
На основании ваших данных я получил:
attributename numofproducts
19" 2
White 1
Black 1
<$100 2
Для нескольких атрибутов ( на основе статьи более известного эксперта Quassnoi в блоге ):
Я удалил таблицу продуктов, поскольку здесь она не нужна
SELECT attribute.name AS attributename, COUNT(*) AS numofproducts
FROM attribute2product
INNER JOIN attribute ON attribute.id = attribute2product.attributeid
WHERE attribute2product.productid IN (
SELECT o.productid
FROM (
SELECT productid
FROM (
SELECT 2 AS att
UNION ALL
SELECT 6 AS att
) v
JOIN attribute2product ON attributeid >= att AND attributeid <= att
) o
GROUP BY o.productid
HAVING COUNT(*) = 2
)
GROUP BY attribute.id, attribute.name
2
, 6
относятся к 19"
и White
соответственно. COUNT(*) = 2
соответствует 2 атрибутам. Дополнительные атрибуты можно добавить, добавив следующее во вложенную производную таблицу:
UNION ALL
SELECT <attributeid> AS att
Как и ожидалось, результат запроса:
attributename numofproducts
19" 1
White 1
<$100 1