Запрос по категориям - PullRequest
       3

Запрос по категориям

1 голос
/ 10 января 2012

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

Спасибо!

Ответы [ 4 ]

1 голос
/ 15 января 2012

Для тех, кто интересуется, как это сделать в 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();
}
1 голос
/ 10 января 2012

Попробуйте:

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 голосов
/ 10 января 2012

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

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

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

0 голосов
/ 10 января 2012

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

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...