Группировка со склейкой

pipanchik
Дата: 16.01.2013 13:56:58
Есть 2 таблицы:


product product_attribute
------------- ---------------------------
| id | name | | product_id | attribute_id |
------------- ---------------------------
| 1 |Продукт1| | 1 | 1 |
------------- ---------------------------
| 2 |Продукт2| | 1 | 2 |
------------- ---------------------------
| 3 |Продукт3| | 2 | 1 |
------------- ---------------------------

Результат
SELECT * FROM product INNER JOIN product_attribute ON product.id = product_attribute.product_id

Получается

----------------------------------------
| id | name | product_id | attribute_id |
------------- ---------------------------
| 1 |Продукт1| 1 | 1 |
-----------------------------------------
| 1 |Продукт1| 1 | 2 |
-----------------------------------------
| 2 |Продукт2| 2 | 1 |
-----------------------------------------

Мне нужно получить продукт у которого attribute_id = 1 и 2. Как это сделать?
Akina
Дата: 16.01.2013 14:00:38
SELECT product.name 
FROM product 
INNER JOIN product_attribute 
ON product.id = product_attribute.product_id
WHERE product_attribute.attribute_id IN (1, 2)
GROUP BY product.name 
HAVING COUNT(DISTINCT product_attribute.attribute_id) = 2
pipanchik
Дата: 16.01.2013 16:10:26
Спасибо большое
pipanchik
Дата: 20.01.2013 14:28:08
А как теперь оптимально посчитать количество получившихся строк?
Hett
Дата: 22.01.2013 12:07:52
Если аттрибутов всегда одно количество, то
SELECT p.name 
FROM product p
INNER JOIN product_attribute pa0
ON p.id = pa0.product_id AND pa0.attribute_id = 1
INNER JOIN product_attribute pa1
ON p.id = pa1.product_id AND pa1.attribute_id = 2
WHERE 
pa0.product_id IS NOT NULL 
AND pa1.product_id IS NOT NULL 
Hett
Дата: 22.01.2013 12:08:27
Пардон, WHERE не нужен тут