【问题标题】:Efficient way to count combinations of records with SQL?用 SQL 计算记录组合的有效方法?
【发布时间】:2013-06-21 18:24:00
【问题描述】:

给定一张订单表和这些订单中的相关商品表,我需要找出每个可能的 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)     |

我已经能够使用子查询和 MySQL GROUP_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;

有没有更好的方法?

【问题讨论】:

  • 这种 GROUP_CONCAT 方法是可行的,因为这个商家只销售了少数 SKU;但是,它不可扩展,因此不可泛化,所以这部分是我正在寻找的。​​span>

标签: mysql sql magento


【解决方案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 项的所有排列。但是,我想不出一种方法可以以独立于数据库的方式对所有组合执行此操作。

【讨论】:

  • 关于加入的要点。当您一次一点地改进查询并且不返回重新分析您的起点时,就会发生这种情况。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 2021-08-31
  • 1970-01-01
  • 2012-12-25
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多