Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在一个MySQL查询中查询人与人之间的两级连接?_Mysql_Sql_Join - Fatal编程技术网

如何在一个MySQL查询中查询人与人之间的两级连接?

如何在一个MySQL查询中查询人与人之间的两级连接?,mysql,sql,join,Mysql,Sql,Join,我有一个具有以下模式的MySQL表: +---------+---------+----------------------+------------+ | User ID | Song ID | Recommending User ID | Created On | +---------+---------+----------------------+------------+ | 1001 | 54 | 1004 | 2011-07-21 |

我有一个具有以下模式的MySQL表:

+---------+---------+----------------------+------------+
| 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,我已经开始测试这个,但它给了我难以置信的膨胀数字。我会继续调整它,看看我是否做错了什么。