2016-10-02 6 views
1

非常に難しい質問で私を助けてください。SQL:JOINなしの集約ペア(挑戦的)

私は2つのカラムを持つMySQLのDBMSに「itemslogを」テーブルを持っている:「ユーザーID」と「ITEMID」、次のようになります。

| user1 | item 1 | 
| user1 | item 2 | 
| user2 | item 1 | 
| user2 | item 2 | 
| user2 | item 3 | 

私はアイテムのすべてのペアを持っているどのくらいのユーザーカウントする必要がある、i.g.

SELECT 
    t1.itemname, 
    t2.itemname, 
    count(*) 
FROM 
    itemslog AS t1 
    CROSS JOIN itemslog AS t2 ON t1.userid = t2.userid 
WHERE 
    t1.itemname < t2.itemname 
GROUP BY 
    t1.itemname, t2.itemname; 

しかし、それは計算の多くを取り、私の状況では、(私はおよそ20万を持って無駄です:

| item1 | item2 | 2 | 
| item1 | item3 | 1 | 
| item2 | item3 | 1 | 

通常、私たちはそのように、JOINの操作に基づいてクエリを使用することができます。そのように答えます行)。私に助言を与えることができます、それを行う別の方法がありますか?前もって感謝します!

+1

ここに数えようとしていることはわかりません。特定のユーザーに特定のアイテムがあるかどうかを確認しますか?または、他の何か? –

+0

'itemid'が主キーである別のテーブル' items'を持っていますか?参照テーブルですか? – trincot

+0

すべてのユーザーは、任意の量のアイテムを運ぶことができます。アイテムのすべてのペアについて、それを運ぶユーザーの数を数えたいと思います。例item1とitem2のペアでは2人のユーザーが参加し、item1とitem3のペアは1つのみです。 –

答えて

1

これはあなたのクエリです:あなたはitemslog(userid, itemname)のインデックスをしたい、このクエリのために

SELECT t1.itemname, t2.itemname, count(*) 
FROM itemslog t1 JOIN 
    itemslog t2 
    ON t1.userid = t2.userid AND t1.itemname < t2.itemname 
GROUP BY t1.itemname, t2.itemname; 

create index itemslog_userid_itemname on itemslog(userid, itemname); 

あなたは、各useridの項目のほんの一握りを持っていると仮定すると、これは妥当な性能を持っている必要があります。

+0

WHOA !!それは、奇跡のような奇跡!)それは動作します!私は索引での作業の理解をより深く掘り下げるべきです。ありがとう、男! –

関連する問題