2012-01-10 13 views
1

私はMagentoで未分類の製品のリストを取得しようとしています。これは必ずしもMagentoの質問ではなく、一般的なSQLの質問です。私はproductテーブルと、category_productという関係テーブルを持つcategoryテーブルを持っています。すべての製品は2つのデフォルトカテゴリ(2と5)で表示されます。 2と5以外のカテゴリを持たないすべての商品を返すクエリを作成するにはどうすればいいですか(Magentoクエリに変換できます)未分類商品の質問

ありがとうございます!

答えて

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 
+0

これは、たとえばカテゴリ2,5,7の商品も返します。 'IN'は排他的ではありません。 –

+0

うわー - 速い応答に感謝します!私がコレクションで何をしようとしているので、クエリはProductテーブルから選択する必要があります。これを反映するためにこれをどのように修正しますか? – Max

+0

@MattFellows:いいえ、そうではありません。 - カテゴリが7の場合、case文は1と評価され、したがって合計は1より大きいと評価されます。したがって、having節はfalseになり、グループは選択されません。 –

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(); 
} 
関連する問題