Mysql PHP中的“喜欢这个的人也喜欢”查询

时间:2015-06-17 20:10:58

标签: php mysql sql associations bayesian

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 

现在,如果有人使用music

访问m_id = 1

然后输出可能就像

   m_id

    5
    2
    4

稍微解释一下......

m_id = 1喜欢users -> {1,3,4}likes ->{2,4,5}依次为m_id=5音乐。由于m_id = 2被最多用户所喜欢,首先是m_id = 4m_id = 1

我的尝试

  • 我查询了喜欢SELECT u_id FROM likes WHERE m_id =1

    的用户

    Association Rules

  • 然后我存储在一个数组中,并选择他们喜欢的每一个 按照伯爵的顺序安排他们。

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

p.s 我听说Bayesian theoremNet::HTTP.post_form(uri, 'promotion_name' => 'bulletin', 'subject' => 'Your Daily Bulletin Update', 'from' => 'noreply@matsu- namibiaflood.opensciencedatacloud.org/', 'list_name' => 'bulletin') 可以是用户来实现此目的。但任何人都可以帮我解决一个例子吗?

2 个答案:

答案 0 :(得分:1)

您可以JOIN返回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来过滤更多内容。

答案 1 :(得分:0)

使用子查询...

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

或者有多少&#34; alsolikes&#34;你想要显示