mysql选择每个用户的值的计数是否大于1

时间:2016-03-22 17:07:11

标签: mysql count

我有一张表喜欢以下内容:

----------------------------
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)那些不止一次为该特定用户重复的曲目。有人可以帮助我吗?

谢谢,

2 个答案:

答案 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