显示所有与用户具有相同“标记”或“类别”的帖子

时间:2013-02-13 17:16:44

标签: mysql sql database

我不确定我的方法是否是我的mysql架构的正确方法,因为它证明是困难的,因为用户最多可以有三个标签,一个帖子最多也可以有三个标签。

例如,如果帖子有标签;音乐,科技。并且用户拥有音乐,体育标签。用户将能够看到该帖子作为标签音乐存在于用户个人资料和帖子中。

我的表格如下:

个人资料有列:

Profile_id | tag1 | tag2 | tag3

帖子有列:

post_id | author | item | tag1 | tag2 | tag3.

表中的每个标记都与特定标记相关。例如。 tag1 =音乐,tag2 =体育等。

根据用户在编辑个人资料或发帖时是否勾选标记,会在表格中插入标记,因此标记的值可能为NULL

2 个答案:

答案 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的复合键,并检查您的查询是否存在重复等。