我有一个包含以下架构的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
答案 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