1

给定一个订单表和这些订单中的相关项目表,我需要找到每个可能的 SKU 组合的订单数。我在 Magento 中执行此操作,但这实际上只是一个 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)     |

我已经能够使用子查询和 MySQLGROUP_CONCAT函数提取我想要的数据,但我想知道是否有一种更有效的方法和/或在没有专有功能的情况下工作。这是我目前拥有的:

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;

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

4

1 回答 1

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 中,对于给定的n ,您可以轻松找到n项的所有排列。但是,我想不出一种方法可以以独立于数据库的方式对所有组合进行操作。

于 2013-06-21T18:32:38.337 回答