SQL按共同项的数量排序表

时间:2018-03-14 16:30:05

标签: sql sqlite

我有3个表,用户,艺术家和联接表。 我想为特定用户找到其他用户表的排序,以及他们在联接表中共有的艺术家数量,或者可能只是server.js其他用户的排序与他们最相似的。

例如在表格中:

n

我想知道user1的排序是(2,3)因为user2与user1共享artist1和artist2,而user3只共享artist1。

有没有办法从SQL获取此功能?

由于

3 个答案:

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

如果有任何问题,请告诉我!