对于我正在处理的网站,我希望用户能够勾选多个代表他/她可能感兴趣的内容的方框,类似于StumbleUpon。用户将检查“Web开发”和“网页设计”,然后单击“提交”,然后将其首选项存储在数据库中。
稍后,如果某人创建了一个标记有他所选择的偏好设置的项目,该用户将获得更新。因此,如果我创建了一个名为“建立网站”并检查了“网站开发”类别的新项目,那么在其个人资料中选择“网站开发”的所有用户都会收到某种消息或电子邮件,提醒他们新建主题。
以MySQL格式实现此功能的最佳方法是什么?我看了一些关于管理分层数据的页面(会有像“计算机”或“音乐”这样的通用类别,管理员可以添加/删除/编辑类别),但这些方法似乎都不是我需要的 - 至少,不是在思考我陷入困境。也许那里有一个更容易回答的问题,我一直在忽视?
答案 0 :(得分:3)
创建一个包含各种兴趣的表格。说
Interests :- id, interest
然后是一个表格,用于存储用户选择的所有兴趣
UserInterests :- user_id, interest_id
项目利益关系为
ProjectInterest :- project_id, interest_id
现在,当添加新项目时,您可以运行类似于以下onw的查询,以获得项目感兴趣的用户
SELECT DISTINCT user_id
FROM UserInterests ui, ProjectInterests pi
WHERE ui.interest_id = pi.interest_id AND pi.project_id = <new project id>
或者,使用显式连接语法:
SELECT DISTINCT user_id
FROM UserInterests ui
INNER JOIN ProjectInterests pi ON ui.interest_id = pi.interest_id
WHERE pi.project_id = <new project id>
答案 1 :(得分:0)
你在想什么 - 我认为 - 是如何实现多对多关系的。 问题是,如果没有将自己锁定在他们可以选择的确切数量的兴趣中,您就无法向用户提供兴趣列表。
解决方案是Junction Table。一方面,您有用户列表,另一方面,您有您的兴趣列表。联结表是第三个表,列出了这两个组之间的关系。
CREATE TABLE `user_interest` (
userid UNSIGNED INT REFERENCES `user` (userid),
interestid UNSIGNED INT REFERENCES `interests` (interestid),
PRIMARY KEY (interestid, userid)
)
现在您有一系列用户和兴趣的独特组合。假设您有一个新闻文章列表,每个文章都分配了一个主题(“interestid”)。现在你可以做点什么了,
SELECT * FROM `article` WHERE `article`.`interestid` IN (
SELECT `interestid` FROM `user_interest` WHERE `userid` = X
)
将检索与用户X的所选兴趣相关的文章列表。首先,您获得与指定用户相关的主题列表,然后您将获得具有匹配主题的文章列表。