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

时间:2011-08-02 16:15:10

标签: mysql sql join

我有一个包含以下架构的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收藏的歌曲ID 54是由1004在7月21日推荐的。扫描1001时,查询需要提供40个点。

现在让这个变得复杂的是我想要添加第二个级别。因此,对于1001收藏的每个用户(即1004),我想以1004的方式搜索它们,同样地给予任何人1004在仍然计算1001时收取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

2 个答案:

答案 0 :(得分:1)

这个怎么样(我打电话给你上面列出的表格"建议"):

每次歌曲被标记为"最爱,"我们需要看看别人是否建议这样做。因此,假设用户UserID仅将SongID标记为他的最爱。"以下人员获得40分:

SELECT Recommending_user_id
FROM Recommendations 
WHERE User_id = [UserID] 
AND Song_id = [SongID]

您问的是如何检查其他级别的建议。我们可以通过建议表的JOIN来实现:

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]

LEFT JOIN确保如果20分用户不存在,则不会破坏查询;你只需获得Twenty的NULL .Recommending_user_id。

请注意,如果您愿意,可以再次加入以向第三级提升10分。 :)

答案 1 :(得分:0)

有很多方法,但我只有5分钟才去看我的女士朋友。所以,这是一种可能的方式...... (不,她不是一个爆炸)

SELECT
  CASE WHEN Mode = 1 THEN [principle].recommending_user_id ELSE [secondary].recommending_user_id END AS user_id,
  SUM(CASE WHEN Mode = 1 THEN 40 ELSE 20 END) AS Score
FROM
  myTable   AS [principle]
LEFT JOIN
  myTable   AS [secondary]
    ON [principle].recommending_user_id = [secondary].user_id
CROSS JOIN
  (SELECT 1 AS MODE UNION ALL SELECT 2) AS Mode
WHERE
  CASE WHEN Mode = 1 THEN [principle].recommending_user_id ELSE [secondary].recommending_user_id END IS NOT NULL
GROUP BY
  CASE WHEN Mode = 1 THEN [principle].recommending_user_id ELSE [secondary].recommending_user_id END