Mysql Не могу осилить отбор из таблицы

Cramac

Новичок
Всем привет.
Есть магазин opencart
у него есть таблица атрибутов:

PHP:
CREATE TABLE IF NOT EXISTS `product_attribute` (
  `product_id` int(11) NOT NULL,
  `attribute_id` int(11) NOT NULL,
  `language_id` int(11) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY (`product_id`,`attribute_id`,`language_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
в него пишутся данные типо (1 строка 1 значение)
ид товара / ид атрибута / значение
(71, 15, 1, '1Гб'),
(71, 14, 1, '4Гб'),
(73, 18, 1, 'Есть'),
(73, 19, 1, 'Есть'),
(72, 19, 1, 'Есть'),
(72, 18, 1, 'Есть'),
(68, 20, 1, 'Есть'),
(101, 13, 1, '800*600'),
(69, 13, 1, '1024*600'),
суть вопроса такова:
Нужно выбрать ИД товара в котором 1 или несколько атрибутов равны заданным значениям.
по 1 атрибуту делаю выбор так:

SELECT * FROM product_attribute
WHERE attribute_id = '15' AND TEXT = '1Гб'
ORDER BY `product_attribute`.`product_id` ASC
все показывает что надо, а как выбрать товар у которого боле 1 атрибута равны заданным?

SELECT *
FROM product_attribute
WHERE (
attribute_id = '12'
AND TEXT = '10\'\''
)
OR (
attribute_id = '15'
AND TEXT = '1Гб'
)
ORDER BY `product_attribute`.`attribute_id` ASC
LIMIT 0 , 30
выводит и то что с 12 атрибутом и что с 15
 

~WR~

Новичок
PHP:
SELECT product_id 
FROM product_attribute
WHERE 
    (attribute_id = '12' AND TEXT = '10')
    OR 
    (attribute_id = '15'AND TEXT = '1Гб')
GROUP BY product_id
HAVING count(*) > 1
 

Cramac

Новичок
Еще вопрос. Как выбрать все product_id у который определенный атрибут вообще не прописан в таблице?
 

Vasilij

Новичок
PHP:
SELECT p.product_id 
FROM product p
     LEFT JOIN product_attribute pa ON (p.product_id = pa.product_id AND pa.attribute_id = '15')
WHERE pa.product_id IS NULL;
?
 

Cramac

Новичок
А подскажите, может как оптимизировать запрос можно, сейчас у меня идет такой запрос полный на выбор товара:

SELECT p.product_id,p2a.text,p2a.attribute_id, (
SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM product p
LEFT JOIN product_description pd ON (p.product_id = pd.product_id)
LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id)
LEFT JOIN product_attribute p2a ON (p.product_id = p2a.product_id)
LEFT JOIN product_to_category p2c ON (p.product_id = p2c.product_id)
WHERE pd.language_id = '1'
AND p.status = '1'
AND p.date_available <= NOW()
AND p2s.store_id = '0'
AND p2c.category_id = '57'
and p.product_id not in ( select product_id from product_attribute where (attribute_id='21' and not text='Есть') or (attribute_id='18' and not text='Есть') )
GROUP BY p.product_id
Все нормально срабатывает если данные атрибуты есть в таблице. Если их нет, то выводит и их.
 
Сверху