我不确定我的方法在mysql模式中是否是正确的方法,因为事实证明这很困难,因为用户最多可以有三个标记,而post也可以有最多三个标记。
例如,如果一个帖子有标签,音乐,技术。用户有标签音乐,体育。当标签音乐同时存在于用户配置文件和帖子中时,用户将能够看到该帖子。
我的桌子如下:
配置文件有列:
Profile_id | tag1 | tag2 | tag3Post有列:
post_id | author | item | tag1 | tag2 | tag3.表中的每个标记都与特定的标记相关。例如:tag1=音乐,tag2=体育等。
在表中插入标记取决于用户在编辑配置文件或发布帖子时是否勾选它,因此标记可以有一个值NULL。
发布于 2013-02-13 17:21:39
首先,你需要修正你的设计。创建一个标记表,然后为每个用户和帖子创建一个查找表,这将使解决方案更加明显。
所以你的新结构是:
配置文件:
profile_id | Other_Profile_Info ...邮报:
post_id | author | item 标签:
tag_id | tagPost_Tag:
post_id | tag_idProfile_Tag:
profile_id | tag_id然后,查询可能如下所示:
SELECT p.* FROM Post AS p
INNER JOIN Post_Tag AS PostTag ON p.post_id = PostTag.post_id
INNER JOIN Profile_Tag AS ProfileTag ON PostTag.tag_id = ProfileTag.tag_id
INNER JOIN Profile AS Profile ON Profile.profile_id = ProfileTag.profile_id
WHERE Profile.profile_id = 'MyID'或使用Sub查询:
SELECT p.* FROM Post AS p
WHERE p.post_id IN
(SELECT post_id FROM Post_Tag WHERE tag_id IN
(SELECT tag_id from Profile_Tag WHERE profile_id = 'MyID')
)发布于 2013-02-13 17:26:14
理想情况下,您希望更多地规范您的数据库。创建一个名为Tags的新表,并拥有列tag_id和tag_name,将为您提供比多列更好的灵活性。例如,如果您希望一个帖子有100个或更多的标签,该怎么办?
创建一个控制posts和标记之间关系的新表(即post_tags)和另一个用于标记和用户(user_tags)的表将使您做得更好。
例如,您可以找到所有具有用户兴趣的帖子:
select p.*
from users u
join user_tags ut on u.user_id = ut.user_id
join post_tags pt on ut.tag_id = pt.tag_id
join posts p on p.id = pt.post_id
where u.user_name = 'theUser'记住,您将需要您的两个多到多个表来拥有两个ids的复合键,并检查您的查询是否有可能重复,等等。
https://stackoverflow.com/questions/14859140
复制相似问题