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