2013-02-13 65 views
1

我不确定我的方法是否是按照我的mysql模式执行此操作的正确方法,因为用户可能会遇到困难最多三个标签和一个帖子最多可以有三个标签。显示与用户具有相同“标记”或“类别”的所有帖子

例如,如果帖子有标签;音乐,技术。并且用户具有标签音乐,体育。用户可以将该帖子看作标签音乐同时存在于用户个人资料和帖子中。

我的表如下所示:

档案有列:

Profile_id | tag1 | tag2 | tag3 

邮政有列:

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

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

的标签插在表依赖于编辑他们的个人资料或作出后,当用户是否蜱,所以标签可以有一个值NULL

回答

2

首先你需要修复你的设计。为每个用户和帖子创建一个标签表和一个查找表,这将使解决方案更加明显。

所以,你的新的结构将是:

简介:

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') 
    ) 
+0

我会尝试改变我的结构,现在谢谢。 Post_Tag表的post_id和tag_id是来自Post和Tag表的外键吗? – rp7 2013-02-13 17:37:48

+0

@ user1888378是的。在这里做的另一件事(除了适当地标准化数据),你将业务逻辑从你的表结构中删除 - 所以,另一个答案指出,增加或减少每个Profile/post的标记不会影响你的数据结构。 – Matthew 2013-02-13 17:43:39

+0

嗨按照这个新的模式是有点难以作为当用户注册时,我现在不确定如何采取他们已经进入的标签?即哪个表格会插入他们已选择的标签 – rp7 2013-02-13 18:37:12

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的复合键,并检查您的查询可能重复等。

+1

我想喜欢指出(因为我不能在@ matthew的回答中做到这一点,我不认为)我的脚本可能会在数据库引擎中得到更好的优化。一般来说,避免子查询和“in”函数是明智的,因为您不能保证子查询将被解析多少次,并且“join”是数据库的全部内容。 – Dragos 2013-02-13 17:32:05

+0

我在我的答案中都包含了这两个选项,但是您应该切换顺序并且通常联接更好(在这种情况下可能会更好),这是正确的。此外 - 有一个upvote - 会让你更接近于能够评论无处不在(需要50名代表):) – Matthew 2013-02-13 17:52:55

+0

@Matthew,谢谢:)当我评论你还没有完成你的答案我猜。 – Dragos 2013-02-13 18:02:04

相关问题