我有以下mysql表(真正的表实际上非常庞大,大约有200万行):
----------------------------
userId | artistId | trackId
----------------------------
user1 | artist1 | track1
-------|----------|--------
user1 | artist1 | track1
-------|----------|--------
user1 | artist1 | track1
-------|----------|--------
user2 | artist1 | track1
-------|----------|--------
user2 | artist2 | track2
-------|----------|--------
user2 | artist2 | track2
-------|----------|--------
.... | .... | ....
我想要的是:对于每个用户,选择用户收听超过3个不同曲目的艺术家(即同一艺术家的3首曲目)。这是因为我需要将此选择视为艺术家的用户偏好,因此,例如,如果用户仅收听艺术家的一首或两首曲目,我不想将其视为"偏好/喜欢& #34 ;. 这是我写的查询,但我不确定这是否正确:
select p.userId, p.artistId, p.trackId
from lastfm_part2 p
join
(select userId, artistId, trackId
from lastfm_part2
group by userId, artistId, trackId
having count(trackId) > 3) as m
on m.userId = p.userId and m.artistId = p.artistId and p.trackID = m.trackId
PS。我需要返回所有行,即使它们看似重复(相同的用户,相同的轨道,相同的艺术家),但实际上它们与不同的时间戳有关。 如果有人帮我理解这个查询是否正确,我感激不尽。
由于
答案 0 :(得分:0)
我在Oracle中测试过,所以也许MySQL有点不同,但下一个查询对我有用。
SELECT p.userId, p.artistId, COUNT( DISTINCT p.trackId )
FROM lastfm_part2
group by userId, artistId
having count( DISTINCT p.trackId ) > 3;