Propel:需要以下SQL查询的Criteria

时间:2011-07-11 09:41:10

标签: sql criteria inner-join propel

经过半天的头痛试图找出双重内心加入,我终于做对了:

SELECT product.id as product_id, count(purchase_vaucher.object_id) as purchased 
FROM purchase_vaucher 
INNER JOIN purchase on purchase.id = purchase_vaucher.object_id 
INNER JOIN product on purchase.product_id = product.id 
WHERE purchase.is_paid=1 
GROUP BY product.id 
ORDER BY purchased_amount desc;

这是什么关系:基本上,三个表:productpurchasepurchase_vaucher(是的,我知道它是“凭证”,但我没有发明架构)。基本上,purchase包含所做的购买和product的反向链接。 purchase_vaucher包含有关优惠券和purchase的反向链接的信息。我在此查询中需要的内容:对于拥有purchase的所有is_paid=1,请计算具有相同产品ID的所有购买的所有凭证,并按产品ID对其进行分组。

我需要的是:上述查询被翻译为Propel Criteria API调用。

我现在就开始研究这个问题了,但如果能节省一些时间,我会很高兴。

感谢。

1 个答案:

答案 0 :(得分:1)

奇怪的是,结果非常简单:

$purchased_amount_column = 'purchased_amount';

$c = new Criteria();
self::addSelectColumns($c);
$c->addAsColumn($purchased_amount_column, 'COUNT(' . PurchaseVaucherPeer::OBJECT_ID . ')');
$c->addGroupByColumn(ProductPeer::ID);
$c->addDescendingOrderByColumn($purchased_amount_column);
$c->add(PurchasePeer::IS_PAID, 1, Criteria::EQUAL);
$c->addJoin(PurchasePeer::ID, PurchaseVaucherPeer::OBJECT_ID, Criteria::INNER_JOIN);
$c->addJoin(PurchasePeer::PRODUCT_ID, ProductPeer::ID, Criteria::INNER_JOIN);

寻呼机出了问题,但我花了5分钟才意识到让它算上这些非平凡标准的记录的方法就是这样:

$pager->setPeerCountMethod('customCount');
...
// customCount:
return YourPeer::doCount($yourCriteria);

就是这样。