如何在一个MySQL查询中查询人与人之间的两级连接?
我有一个具有以下模式的MySQL表:如何在一个MySQL查询中查询人与人之间的两级连接?,mysql,sql,join,Mysql,Sql,Join,我有一个具有以下模式的MySQL表: +---------+---------+----------------------+------------+ | User ID | Song ID | Recommending User ID | Created On | +---------+---------+----------------------+------------+ | 1001 | 54 | 1004 | 2011-07-21 |
+---------+---------+----------------------+------------+
| User ID | Song ID | Recommending User ID | Created On |
+---------+---------+----------------------+------------+
| 1001 | 54 | 1004 | 2011-07-21 |
| 1002 | 23 | 1005 | 2011-07-28 |
| 1002 | 166 | 1001 | 2011-07-31 |
+---------+---------+----------------------+------------+
我想做的是,当有人喜欢他们推荐的歌曲时,给用户打分。因此,该查询会对系统中的每个用户进行查询,并找出与用户扫描相关的点数最多的用户
假设我们使用用户1001。1001喜欢1004于7月21日推荐的歌曲id 54。扫描1001时查询需要打40分
现在让这变得复杂的是,我想添加第二个级别。因此,对于1001喜欢的每个用户(即1004),我希望以同样的方式搜索他们(1004),在仍然计算1001时,给任何1004喜欢的用户20分
只是想再次澄清一下。以1002为例:
Computing 1002:
User 1005 gets 40 pts
User 1001 gets 40 pts
Computing 1005
nothing
Computing 1001
User 1004 gets 20 pts
Done
非常感谢关于如何开始的任何帮助:)
*编辑:指定mysql有很多方法,但我只有5分钟的时间去见我的女朋友。所以,这里有一个可能的方法。。。 (不,她不是个大块头)
有很多方法,但我只有5分钟的时间去看我的女朋友。所以,这里有一个可能的方法。。。 (不,她不是个大块头) 这个怎么样(我把你在上面列出的表格称为“建议”): 每次一首歌被标记为“最爱”,我们都需要看看是否有人推荐这首歌。因此,假设用户
UserID
刚刚将SongID
标记为他的“最爱”。下面的人得到40分:
SELECT Recommending_user_id
FROM Recommendations
WHERE User_id = [UserID]
AND Song_id = [SongID]
您所问的是如何检查其他级别的建议。我们可以通过将推荐表的连接到自身来实现:
SELECT Forty.Recommending_user_id, Twenty.Recommending_user_id
FROM Recommendations Forty
LEFT JOIN Recommendations Twenty
ON (Forty.Recommending_user_id = Twenty.User_id
AND Forty.Song_id = Twenty.Song_id)
WHERE Forty.User_id = [UserID]
AND Forty.Song_id = [SongID]
左连接
确保如果20点用户不存在,它不会中断查询;您只需花20分钟就可以获得NULL
。推荐用户id
请注意,如果您愿意,您可以再次加入,在第三级以上获得10分。:) 这个怎么样(我把你上面列出的表格称为“建议”):
每次一首歌被标记为“最爱”,我们都需要看看是否有人推荐这首歌。因此,假设用户UserID
刚刚将SongID
标记为他的“最爱”。下面的人得到40分:
SELECT Recommending_user_id
FROM Recommendations
WHERE User_id = [UserID]
AND Song_id = [SongID]
您所问的是如何检查其他级别的建议。我们可以通过将推荐表的连接到自身来实现:
SELECT Forty.Recommending_user_id, Twenty.Recommending_user_id
FROM Recommendations Forty
LEFT JOIN Recommendations Twenty
ON (Forty.Recommending_user_id = Twenty.User_id
AND Forty.Song_id = Twenty.Song_id)
WHERE Forty.User_id = [UserID]
AND Forty.Song_id = [SongID]
左连接
确保如果20点用户不存在,它不会中断查询;您只需花20分钟就可以获得NULL
。推荐用户id
请注意,如果您愿意,您可以再次加入,在第三级以上获得10分。:) 这是否需要我对UserID和SongID的每个组合进行迭代?我可能会把它放到一个子查询中,其中UserID和SongID被连接到一个具有这些组合的父查询中。我想每次从头开始计算所有的分数可能会很慢,但可能不会。为了避免这种情况,应该为每个用户保留一个“点数”栏,并在有人“收藏”或“删除”歌曲时通过添加或减去40或20来更新该栏。最糟糕的情况是,您只需在开始时运行一次大型查询,即可获得每个人的初始点。您甚至可以偶尔运行大型查询,以确保您的观点完全正确(我认为这就是声誉的工作原理!)。这是否需要我对UserID和SongID的每个组合进行迭代?我可能会把它放到一个子查询中,其中UserID和SongID被连接到一个具有这些组合的父查询中。我想每次从头开始计算所有的分数可能会很慢,但可能不会。为了避免这种情况,应该为每个用户保留一个“点数”栏,并在有人“收藏”或“删除”歌曲时通过添加或减去40或20来更新该栏。最糟糕的情况是,您只需在开始时运行一次大型查询,即可获得每个人的初始点。您甚至可以偶尔运行大型查询,以确保您的分数完全正确(我认为这就是声誉的工作原理!)。感谢Dems,我已经开始测试,但它给了我难以置信的夸大数字。我会继续调整它,看看我是否做错了什么。谢谢Dems,我已经开始测试这个,但它给了我难以置信的膨胀数字。我会继续调整它,看看我是否做错了什么。