我有一张表喜欢以下内容:
----------------------------
userId | artistId | trackId
----------------------------
user1 | artist1 | track1
-------|----------|--------
user1 | artist1 | track1
-------|----------|--------
user1 | artist1 | track1
-------|----------|--------
user2 | artist1 | track1
-------|----------|--------
user2 | artist2 | track2
-------|----------|--------
user2 | artist2 | track2
-------|----------|--------
.... | .... | ....
我需要做的是:为每个用户选择他不止一次听过的那些曲目。因此,例如,在上表中,对于用户1,它应该返回track1(所有3行),而对于user2,它应该仅返回track2(再次返回所有两行)。 我知道如何为每个用户计算列的特定值,例如为了计算每个用户收听track1和track2的次数,我写这个:
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
但由于我的桌子很大(大约500万行)有很多曲目,我不知道如何选择(FOR EACH USER)那些不止一次为该特定用户重复的曲目。有人可以帮助我吗?
谢谢,
答案 0 :(得分:0)
非常简单的查询:
select userId, trackId
from populartracks_logs
group by userId, trackId
having count(*) > 1
注意有条款
答案 1 :(得分:0)
如果您想要检索的所有行,你需要一个子查询,并在其上联接(您可以在内部查询,组通过添加artistId并加入条款)
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