2013-06-21 4 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, но я бы ike знать, есть ли способ сделать это, что более эффективно и/или работает без использования собственных функций. Вот что у меня есть:

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