2017-02-01 5 views
0

私は自分自身にテーブルを接続し、クエリを持っています。結果には重複行(並べ替え)が含まれています。このクエリの目的は、最も頻繁に一緒に購入される製品のリストを作成することです。最初の6つの結果は、異なる順序で、同じ接続であることをのMySQL:なくし、それ自体にテーブルを結合重複行

+-------------+-------------+-------------+--------+ 
| ITEM  | ITEM2  | ITEM3  | oCount | 
+-------------+-------------+-------------+--------+ 
| 02B13.04.GP | 77A04.10 | 45A04.04.GP |  54 | 
| 02B13.04.GP | 45A04.04.GP | 77A04.10 |  54 | 
| 77A04.10 | 45A04.04.GP | 02B13.04.GP |  54 | 
| 45A04.04.GP | 02B13.04.GP | 77A04.10 |  54 | 
| 77A04.10 | 02B13.04.GP | 45A04.04.GP |  54 | 
| 45A04.04.GP | 77A04.10 | 02B13.04.GP |  54 | 
| 57B01.01.GP | 57B01.11.GP | 57B01.10.GP |  12 | 
| 57B01.10.GP | 57B01.11.GP | 57B01.01.GP |  12 | 
| 57B01.01.GP | 57B01.10.GP | 57B01.11.GP |  12 | 
| 57B01.10.GP | 57B01.01.GP | 57B01.11.GP |  12 | 
| 57B01.11.GP | 57B01.10.GP | 57B01.01.GP |  12 | 
| 57B01.11.GP | 57B01.01.GP | 57B01.10.GP |  12 | 

注:

SELECT o1.ITEM 
,o2.ITEM as ITEM2 
,o3.ITEM AS ITEM3 
,count(DISTINCT o1.ORDERNUM) as oCount 
FROM orders o1 
INNER JOIN orders o2 ON o2.ORDERNUM = o1.ORDERNUM AND o2.ITEM != o1.ITEM 
LEFT OUTER JOIN orders o3 ON o3.ORDERNUM = o1.ORDERNUM AND o3.ITEM != o2.ITEM AND o3.ITEM != o1.ITEM 
GROUP BY o1.ITEM, o2.ITEM, o3.ITEM 
ORDER BY oCount DESC 

そして、最初の12件の結果:このクエリを考えてみましょう。 2番目の6つの結果には同じ問題があります(これは結果全体を通じて続きます)。私の目標は、各アイテムグループの各組み合わせに対して1つの行ではなく、各アイテムグループに対して1つのレコードを持つことです。私はこれらの繰り返しの結果を回避することができますどのように

また、このクエリに対するより効率的なアプローチに関するアドバイスは、歓迎します(私は追加の参加を追加したいが、1,000,000件の注文ではリソース要件が満たされていない)。

============================================== ==

EDIT:あなたがテーブル構造を共有することができダルシャンの質問

に答えるために:

表には、すべての注文のための行が含まれています。注文に複数の商品が含まれている場合は、商品ごとに1つの商品が表示されます(注文に複数の商品がある場合)。このクエリの唯一の懸念事項は次のとおりです。

ORDERNUM CHAR : Order Number 
ITEM CHAR : SKU for the item 
QTY INT : Quantity purchased 
ORDDATE DATETIME : Order Date 

返された結果:上記の結果サンプルに記載されているものがすべて必要です。目的は、最も頻繁に一緒に購入される製品のリストを取得することです。あなたが何をしたいか

+0

あなたがの構造を共有できます注文表と予想される出力? –

+0

@DarshanMehta私はそれが仕事をしてくれたおかげで – mwex501

答えて

1

は関係なく、位置の重複行を排除することです。あなたは、常に項目のすべての組み合わせを持っているので、1つのトリックは、ここで< ITEM2 < ITEM3

ITEM1言う述語に応じて結果をフィルタリングすることである可能性のある解決策です:

SELECT a.item, b.item, c.item, count(*) 
from `orders` a left join orders b 
on a.ordernum = b.ordernum and a.item <> b.item 
left join orders c on a.ordernum = c.ordernum 
and a.item <> c.item and b.item <> c.item 
where a.item < b.item and b.item < c.item 
group by a.item, b.item, c.item 
order by count(*) desc 
+0

@eugenioご質問を含めるように質問を編集しました! – mwex501

関連する問題