“喜欢这个的人也喜欢” Mysql PHP 中的查询
" People Who Liked this Also Liked " Query in Mysql PHP
Music table
id | title
1 Rap God
2 Blank Space
3 Bad Blood
4 Speedom
5 Hit 'em up
Like table
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
访问 music
那么输出可能像
m_id
5
2
4
稍微解释一下...
因为 m_id = 1
被 users -> {1,3,4}
喜欢,而 likes ->{2,4,5}
音乐。由于 m_id=5
被最大数量的用户喜欢,因此首先是 m_id = 2
和 m_id = 4
。
我的尝试
我查询了点赞的用户m_id = 1
SELECT u_id FROM likes WHERE m_id =1
然后我存储在一个数组中并选择他们的每一个喜欢和
按计数的降序排列。
但这是一个非常缓慢且漫长的过程,我有什么办法可以做到这一点吗?
p.s 我听说 Association Rules
和 Bayesian theorem
可以被用户实现。但是谁能帮我举个例子吗?
您可以 JOIN
返回 Like
table 并执行类似的操作。
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
和可选的
LIMIT 0, 10
或者你想显示多少"alsolikes"
Music table
id | title
1 Rap God
2 Blank Space
3 Bad Blood
4 Speedom
5 Hit 'em up
Like table
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
music
那么输出可能像
m_id
5
2
4
稍微解释一下...
因为 m_id = 1
被 users -> {1,3,4}
喜欢,而 likes ->{2,4,5}
音乐。由于 m_id=5
被最大数量的用户喜欢,因此首先是 m_id = 2
和 m_id = 4
。
我的尝试
我查询了点赞的用户
m_id = 1
SELECT u_id FROM likes WHERE m_id =1
然后我存储在一个数组中并选择他们的每一个喜欢和 按计数的降序排列。
但这是一个非常缓慢且漫长的过程,我有什么办法可以做到这一点吗?
p.s 我听说 Association Rules
和 Bayesian theorem
可以被用户实现。但是谁能帮我举个例子吗?
您可以 JOIN
返回 Like
table 并执行类似的操作。
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
和可选的
LIMIT 0, 10
或者你想显示多少"alsolikes"