2016-07-25 84 views
1

我设法覆盖了Mage/Catalog/Model/Config.php并创建了一个方法,添加了一个名为“Sort By Top Sellers”的新排序选项。如何从上个月的最畅销产品中挑选Magento产品,基于mysql查询的样式?

我还添加了其中声明,我可以从上月数据,但收集不输出所有的产品,只是在上个月buyed的那些(我需要的所有产品,排序不仅上个月的)。

查询输出正确无其中声明。

关于如何解决这个问题的任何想法?

public function sortByTopSelling($dir){ 
    $today = time(); 
    $last = $today - (60*60*24*30); 
    $from = date("Y-m-d H:i:s", $last); 
    $to = date("Y-m-d H:i:s", $today); 

    $this->getSelect()->joinLeft('sales_flat_order_item AS order_item','e.entity_id = order_item.product_id', 
    'SUM(order_item.qty_ordered) AS ordered_qty')->where('`order_item`.`created_at` > "'.$from.'"')->group('e.entity_id')->order('ordered_qty DESC'); 

} 
+0

好问题。我也需要这个。任何关于这个的消息? –

回答

1

在答复作为评论或回答之间辩论了一段时间,因为我对Magento代码不是100%确定。

MYSQL:

select e.entity_id, SUM(order_item.qty_ordered) AS ordered_qty 
from magento.catalog_product_entity as e 
left join magento.sales_flat_order_item AS order_item on e.entity_id = order_item.product_id and order_item.created_at > DATE_FORMAT(NOW() ,'%Y-%m-01') 
group by e.entity_id 
order by ordered_qty DESC; 

我没有可靠的方法来测试Magento的代码,但它应该是沿着线的东西:

$this->getSelect()->joinLeft('sales_flat_order_item AS order_item',"e.entity_id = order_item.product_id and order_item.created_at > $from", 
    'SUM(order_item.qty_ordered) AS ordered_qty')->group('e.entity_id')->order('ordered_qty DESC'); 

的另一种方式做到这一点将or order_item.created_at is null添加到哪里,但这需要比其他连接条件运行更长的时间,而在我的Magento数据库中,查询已经花费了惊人的90秒,但我的表格非常庞大,它可能适用于您的实现。

+0

太棒了。谢谢。加工。 –