我不确定我的方法是否是我的mysql架构的正确方法,因为它证明是困难的,因为用户最多可以有三个标签,一个帖子最多也可以有三个标签。
例如,如果帖子有标签;音乐,科技。并且用户拥有音乐,体育标签。用户将能够看到该帖子作为标签音乐存在于用户个人资料和帖子中。
我的表格如下:
个人资料有列:
Profile_id | tag1 | tag2 | tag3
帖子有列:
post_id | author | item | tag1 | tag2 | tag3.
表中的每个标记都与特定标记相关。例如。 tag1
=音乐,tag2
=体育等。
根据用户在编辑个人资料或发帖时是否勾选标记,会在表格中插入标记,因此标记的值可能为NULL
。
答案 0 :(得分:2)
首先,你需要修复你的设计。创建一个Tags表,然后为每个用户和帖子创建一个查找表,这将使解决方案更加明显。
所以你的新结构将是:
配置文件:强>
profile_id | Other_Profile_Info ...
发表:强>
post_id | author | item
代码:强>
tag_id | tag
<强> Post_Tag:强>
post_id | tag_id
<强> Profile_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'
或使用子查询:
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')
)
答案 1 :(得分:2)
理想情况下,您希望更多地规范化数据库。创建一个名为Tags
且具有列tag_id和tag_name的新表将为您提供比多列更好的灵活性。例如,如果您希望帖子包含100个或更多标签,该怎么办?
创建一个新表来管理帖子和标签之间的关系(例如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'
请记住,您需要两个多对多表来获得两个ID的复合键,并检查您的查询是否存在重复等。