2016-03-22 7 views
1

Ich habe eine Tabelle, die folgende gefallen:mysql wählen, wenn Anzahl der Werte für jeden Benutzer von mehr als 1

---------------------------- 
userId | artistId | trackId 
---------------------------- 
user1 | artist1 | track1 
-------|----------|-------- 
user1 | artist1 | track1 
-------|----------|-------- 
user1 | artist1 | track1 
-------|----------|-------- 
user2 | artist1 | track1 
-------|----------|-------- 
user2 | artist2 | track2 
-------|----------|-------- 
user2 | artist2 | track2 
-------|----------|-------- 
.... | .... | .... 

Was muss ich tun ist: für jeden Benutzer, wählen Sie diese Spuren, dass er mehr hörte als einmal . So sollte beispielsweise in der obigen Tabelle für Benutzer 1 Spur 1 (alle 3 Zeilen) zurückgegeben werden und für Benutzer 2 nur Spur 2 (wiederum alle zwei Zeilen) zurückgegeben werden. Ich weiß, wie bestimmte Werte einer Spalte für jeden Benutzer, z. zu zählen einige Male Track1 und track2 jeder Benutzer zugehört, ich schreibe dies:

select userId, 
    sum(case when trackId = 'track1' then 1 else 0 end) as track1_count, 
    sum(case when trackId = 'track2' then 1 else 0 end) as track2_count 
from populartracks_logs 
group by userId 

Aber da mein Tisch groß (etwa 5 Millionen Zeilen) mit vielen Spuren ist, weiß ich nicht, wie zu wählen (FOR JEDER BENUTZER) jene Tracks, die für diesen spezifischen Benutzer mehr als einmal wiederholt werden. Könnte mir bitte jemand helfen?

Danke,

+0

'Gruppe von userid, trackid', dann. Die Summe/Fall-Geschäft ist sinnlos, wenn Sie tun könnten, was Sie wollen, indem Sie einfach eine andere Gruppenklausel hinzufügen. –

Antwort

0

Wenn Sie alle Zeilen abrufen möchten, können Sie eine Unterabfrage benötigen, und eine Verknüpfung auf sie (Sie kann artistId in der inneren Abfrage hinzufügen, Gruppierung nach und Join-Klausel)

select userId, trackId, artistId 
from populartracks_logs p 
join 
    (select userId, trackId 
    from populartracks_logs 
    group by userId, trackId 
    having count(*) > 1) as m 
    on m.userId = p.userId and p.trackID = m.trackId 
+0

Danke für Ihre Antwort. Es funktioniert :) – mOna

+0

Kannst du ein wenig erklären warum Join benötigt wird? Sie können artistid in group einschließen, erhalten das gleiche Ergebnis, viel schneller –

+1

@Lashane Die Frage erwähnt: alle 3 Zeilen (bzw. alle 2 Zeilen) nach Gruppe abrufen, wenn es mehrere gibt. Gruppieren nach würde nur eine Zeile nach "Gruppe" zurückgeben. –

0

ganz einfache Abfrage:

select userId, trackId 
from populartracks_logs 
group by userId, trackId 
having count(*) > 1 

note Klausel mit

+0

Danke für Ihre Antwort. Ich habe den Fehler 1064 erhalten. – mOna

Verwandte Themen