SQL按公用项数对表进行排序

SQL按公用项数对表进行排序,sql,sqlite,Sql,Sqlite,我有3个表,用户、艺术家和一个联接表。 我想找出对于一个特定的用户,用户表的其余部分的顺序是根据他们在联接表中有共同点的艺术家的数量,或者可能只是与他们有最多共同点的n个其他用户 例如,在表中: userID | artistID -------|---------- 1 | 1 1 | 2 2 | 1 2 | 2 3 | 1 我想得到user1的顺序是2,3,因为user2与user1共享artist1和arti

我有3个表,用户、艺术家和一个联接表。 我想找出对于一个特定的用户,用户表的其余部分的顺序是根据他们在联接表中有共同点的艺术家的数量,或者可能只是与他们有最多共同点的n个其他用户

例如,在表中:

userID | artistID
-------|----------
   1   |    1
   1   |    2
   2   |    1
   2   |    2
   3   |    1
我想得到user1的顺序是2,3,因为user2与user1共享artist1和artist2,而user3只共享artist1

有没有一种方法可以从SQL中获取此信息


谢谢

您可以通过自加入和聚合来实现这一点:

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;

您可以通过自连接和聚合来实现这一点:

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;

假设您始终知道要再次检查的用户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;

这避免了在大型表上可能具有更好性能的联接。您的示例是SQLFIDLE

,假设您始终知道要再次检查的用户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

如果您知道要检查的用户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;

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

如果您知道要检查的用户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;

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

@GordonLinoff我已经提供了样本数据和期望的结果。让我不高兴的是你提到了三张表,但回答这个问题只需要一张表。@GordonLinoff我提供了示例数据和期望的结果。让我不舒服的是,你提到了三张桌子,但回答这个问题只需要一张桌子。计数中的别名已经转换了字母。我试图编辑它,但编辑必须至少包含六个字符。计数中的别名已转换为字母。我试图编辑它,但编辑必须至少有六个字符。