未分类的产品查询

时间:2012-01-10 10:42:10

标签: mysql sql magento

我正在尝试在Magento中获取未分类产品列表。这不一定是Magento的问题,而是一般的SQL问题。我有一个product表和一个category表,其中有一个名为category_product的关系表。每个产品都出现在两个默认类别(2和5)中。我如何构建一个查询(我可以将其转换为Magento查询),该查询返回除2和5之外没有任何类别的所有产品?

谢谢!

4 个答案:

答案 0 :(得分:1)

尝试:

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

答案 1 :(得分: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();
}

答案 2 :(得分: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))

答案 3 :(得分:0)

尝试以下查询

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

我假设唯一的类别确实是2和5。