2013-06-21 27 views
1

给出这些订单中的订单表和相关的物料表,我需要查找每种可能的SKU组合的订单数量。我在Magento中这样做,但这实际上只是一个SQL问题,因为我直接在数据库级别工作。用SQL计算记录组合的有效方法?

下面是每个表的相关部分:

sales_flat_order

| entity_id | int(10) unsigned | -- primary key 

sales_flat_order_item

| order_id | int(10) unsigned | -- foreign key to order table's entity_id 
| sku  | varchar(255)  | 

我已经能拉我想用一个数据子查询和MySQL GROUP_CONCAT函数,但我会l了解是否有这样做的方式更有效率和/或没有专有功能。这是我目前有:

SELECT skulist, COUNT(skulist) 
FROM (
    SELECT GROUP_CONCAT(DISTINCT sku ORDER BY sku) skulist 
    FROM sales_flat_order orders 
    JOIN sales_flat_order_item items ON orders.entity_id = items.order_id 
    GROUP BY order_id 
) skulists 
GROUP BY skulist; 

有没有更好的方式来做到这一点?

+0

这个GROUP_CONCAT方法是可行的,因为这个商家只出售少数SKU;然而,它不具有可扩展性,因此不具有可推广性,所以这部分是我正在寻找的。 – ScottSB

回答

1

事实上,这是做这件事的最好方法,只有一个小小的提示。你可以让你的查询更高效通过消除join

SELECT skulist, COUNT(skulist) 
FROM (SELECT GROUP_CONCAT(DISTINCT sku ORDER BY sku) as skulist 
     FROM sales_flat_order_item items 
     GROUP BY order_id 
    ) skulists 
GROUP BY skulist; 

至于没有使用数据库特定的功能。这很难。大多数数据库都有办法做group_concat(distinct . . .)。据我所知,没有两个用同样的方法(好吧,不是真的,因为Postgres派生的数据库确实使用相同的语法,但足够接近)。

在标准SQL中,你可以很容易地找到ň项的所有排列,对于给定ñ。但是,我无法想出一种以独立于数据库的方式来完成所有组合的方法。

+0

关于加入的好处。这就是当你逐步发展一个查询时发生的事情,不要回头重新分析你的出发点。谢谢。 – ScottSB