2016-10-02 4 views
1

Könnten Sie mir bitte mit einer sehr schwierigen Frage helfen?SQL: Aggregieren von Paaren ohne JOIN (herausfordernd)

Ich habe eine Tabelle ‚itemslog‘ in MySQL DBMS mit zwei Spalten: ‚Benutzer-ID‘ und ‚itemid‘, sieht aus wie:

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

ich zählen müssen, wie viele Nutzer jedes Paar Artikel haben, I. G. Antwort wie folgt aus:

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

Normalerweise wir Abfrage basierend auf JOIN-Operationen verwenden können, wie folgt aus:

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; 

Aber es braucht eine Menge Berechnungen und in meiner Situation ist es sinnlos, (ich habe über 200k Reihen). Kannst du mir einen Rat geben, gibt es andere Möglichkeiten, das zu tun? Vielen Dank im Voraus!

+1

Es ist mir nicht klar, was Sie hier zu zählen versuchen. Willst du sehen, ob ein bestimmter Benutzer bestimmte Gegenstände hat? Oder etwas anderes? –

+0

Haben Sie eine andere Tabelle 'items', in der' itemid' der Primärschlüssel ist - eine Referenztabelle? – trincot

+0

Jeder Benutzer konnte eine beliebige Menge an Gegenständen tragen. Für jedes Elementpaar möchte ich die Anzahl der Benutzer zählen, die es beide tragen. Im Beispielpaar item1 & item2 tragen Sie zwei Benutzer und paaren Sie item1 & item3 - nur eins. –

Antwort

1

Das ist Ihre Abfrage:

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; 

Für diese Abfrage Sie einen Index auf itemslog(userid, itemname) wollen:

create index itemslog_userid_itemname on itemslog(userid, itemname); 

Vorausgesetzt, dass Sie für jede userid nur eine Handvoll Einzelteile haben, diese angemessene Leistung haben sollte .

+0

WHOA !! Es sieht aus wie ein verdammtes Wunder!) Es funktioniert! Ich sollte besser verstehen, wenn ich mit Index arbeite. Vielen Dank, Mann! –