&引用;喜欢这个的人也喜欢;Mysql-PHP中的查询

&引用;喜欢这个的人也喜欢;Mysql-PHP中的查询,php,mysql,sql,associations,bayesian,Php,Mysql,Sql,Associations,Bayesian,音乐表 id | title 1 Rap God 2 Blank Space 3 Bad Blood 4 Speedom 5 Hit 'em up u_id | m_id 1 1 1 2 1 4 1 5 2 3 2 4 2 5 3 1 3 5 4 1 4 2 4 5 Like表 id | title 1 Rap God 2 Bla

音乐表

id | title
1    Rap God
2    Blank Space
3    Bad Blood
4    Speedom
5    Hit 'em up
u_id | m_id
1      1
1      2
1      4
1      5
2      3
2      4
2      5
3      1
3      5
4      1
4      2
4      5 
Like表

id | title
1    Rap God
2    Blank Space
3    Bad Blood
4    Speedom
5    Hit 'em up
u_id | m_id
1      1
1      2
1      4
1      5
2      3
2      4
2      5
3      1
3      5
4      1
4      2
4      5 
现在如果有人以
m_id=1

那么输出可能是

   m_id

    5
    2
    4
解释一下…

由于
m_id=1
受到
users->{1,3,4}
的喜爱,而
又喜欢->{2,4,5}
音乐。由于
m_id=5
受到最多用户的喜爱,因此它的第一个用户是
m_id=2
m_id=4

我的尝试

  • 我询问了喜欢
    m_id=1

    从m\u id=1的likes中选择u\u id

  • 然后我将其存储在一个数组中,并选择了它们各自喜欢的和 按计数顺序排列

但这是一个非常缓慢和漫长的过程,我有什么办法可以做到这一点吗


p.s我听说了
关联规则
贝叶斯定理
可以由用户来实现。但是有人能帮我举个例子吗?

你可以
加入
回到
Like
表,然后做类似的事情

SELECT also_like.m_id, COUNT(also_like.m_id)
FROM [like] AS did_like
JOIN [like] AS also_like ON
    also_like.u_id = did_like.u_id
    AND also_like.m_id != did_like.m_id
WHERE did_like.m_id = 1
GROUP BY also_like.m_id
ORDER BY COUNT(also_like.m_id)
本质上,您得到的是喜欢某个项目的用户列表,然后得到这些用户喜欢的完整列表,不包括他们刚刚喜欢的项目

然后,您可以添加一个
HAVING
子句或
LIMIT
来进一步过滤内容

使用子查询

SELECT m_id, count(u_id) as Rank FROM `like`
WHERE u_id in
(
   SELECT u_id
   FROM `like`
   WHERE m_id = 1
)
AND m_id <> 1
GROUP BY m_id
ORDER BY Rank DESC

或者要显示多少个“alsolikes”

该查询工作得出奇地好。我为10k个用户和10k个项目填充了
like
表,其中包含30k行,结果或多或少是即时的。在SELECT和ORDER子句中添加一个
COUNT(*)
,也可能有助于排名。