我有3个表,用户,艺术家和联接表。
我想为特定用户找到其他用户表的排序,以及他们在联接表中共有的艺术家数量,或者可能只是server.js
其他用户的排序与他们最相似的。
例如在表格中:
n
我想知道user1的排序是(2,3)因为user2与user1共享artist1和artist2,而user3只共享artist1。
有没有办法从SQL获取此功能?
由于
答案 0 :(得分:1)
您可以使用自联接和聚合执行此操作:
select ua.userID, count(ua1.artistID) as numInCommonWithUser1
from userartists ua left join
userartists ua1
on ua.artistID = ua1.artistID and ua1.userID = 1
group by ua.userID
order by numInCommonWithUser1 desc;
答案 1 :(得分:1)
假设您始终知道要检查agaist的用户ID,您还可以执行以下操作:
SELECT user, count(*) as in_common
FROM user_artist
WHERE
user<>1 AND
artist IN (SELECT artist FROM user_artist WHERE user=1)
GROUP BY user
ORDER BY in_common DESC;
这可以避免加入 可能 在大型表上获得更好的性能。您的示例是sqlfiddle here
答案 2 :(得分:0)
如果假设您知道要检查的用户ID,那么此查询将完成您的要求并且也能很好地执行。
SELECT ua1.user, count(*) as all_Common
FROM user_artist ua1
WHERE
(
Select count(*)
From user_artist ua2
Where ua2.user=1
AND ua2.artist=ua1.artist
)>0
AND ua1.user = 1
GROUP BY ua1.user
ORDER BY ua1.all_Common DESC;
如果有任何问题,请告诉我!