2012-01-10 4 views
1

Я пытаюсь получить список некатегоризированных продуктов в Magento. Это не обязательно вопрос Magento, а общий вопрос SQL. У меня есть таблица product и таблица category, таблица отношений которой называется category_product. Каждый продукт отображается в двух категориях по умолчанию (2 и 5). Как мне построить запрос (я могу преобразовать его в запрос Magento), который возвращает все продукты, у которых нет категорий, отличных от 2 и 5?Без рубрики Продукты Запрос

Спасибо!

ответ

1

Try:

select p.product_id, p.name 
from category_product cp 
join product p on cp.product_id = p.product_id 
group by cp.product_id 
having sum(case when category_id in (2,5) then 0 else 1 end) = 0 
+0

Это, однако, будет возвращать продукты с категориями 2, 5 и 7. 'IN' не является эксклюзивным. –

+0

Wow - спасибо за быстрые ответы! Из-за того, что я пытаюсь сделать с коллекцией, запрос должен выбрать из таблицы Product. Как бы вы изменили это, чтобы отразить это? – Max

+0

@MattFellows: Нет, он не будет - где категория равна 7, оператор case будет оценивать до 1, и поэтому сумма будет оцениваться больше 1 - предложение having будет поэтому ложным и группа не будет выбрана. –

0

Не уверен, что это является наиболее эффективным, но он должен работать ...

SELECT * from product p 
INNER JOIN category_product cp on p.id = cp.product_id 
WHERE cp.category_id IN (2, 5) AND cp.category_id NOT IN (SELECT category_id FROM category_product WHERE category_id NOT IN (2,5)) 
0

Попробуйте следующий запрос

select product.name 
from product inner join category_product 
on product.id = category_product.product 
having count (*) < 2 

Я предполагаю, что единственные категории действительно 2 и 5.

1

Для тех, кто заинтересован в том, как это сделать в Magento для сетки Adminhtml, вот функция _prepareCollection (проверена в 1.6.1.0). То, что я написал в вопросе о категориях 2 и 5, оказалось дикой гусиной погоней.

protected function _prepareCollection() 
{ 
    $collection = Mage::getModel('catalog/product')->getCollection() 
     ->addAttributeToSelect('name') 
     ->addAttributeToSelect('status') /* so i can filter by enabled/disabled */ 
     ->joinField('category_product' 
        , 'catalog_category_product' 
        , 'category_id' 
        , 'product_id = entity_id' 
        , null 
        , 'left' 
        ) 
     ; 

    /*ideally this should be an 'addFieldToFilter' but it doesn't work. Oh well.*/ 
    $collection->getSelect() 
     ->where('at_category_product.category_id IS NULL') 
     ; 

    $this->setCollection($collection); 
    return parent::_prepareCollection(); 
}