首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示所有具有相同用户“标记”或“类别”的帖子

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

Stack Overflow用户
提问于 2013-02-13 17:16:44
回答 2查看 103关注 0票数 1

我不确定我的方法在mysql模式中是否是正确的方法,因为事实证明这很困难,因为用户最多可以有三个标记,而post也可以有最多三个标记。

例如,如果一个帖子有标签,音乐,技术。用户有标签音乐,体育。当标签音乐同时存在于用户配置文件和帖子中时,用户将能够看到该帖子。

我的桌子如下:

配置文件有列:

代码语言:javascript
复制
Profile_id | tag1 | tag2 | tag3

Post有列:

代码语言:javascript
复制
post_id | author | item | tag1 | tag2 | tag3.

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

在表中插入标记取决于用户在编辑配置文件或发布帖子时是否勾选它,因此标记可以有一个值NULL

EN

回答 2

Stack Overflow用户

发布于 2013-02-13 17:21:39

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

所以你的新结构是:

配置文件:

代码语言:javascript
复制
profile_id | Other_Profile_Info ...

邮报:

代码语言:javascript
复制
post_id | author | item 

标签:

代码语言:javascript
复制
tag_id | tag

Post_Tag:

代码语言:javascript
复制
post_id | tag_id

Profile_Tag:

代码语言:javascript
复制
profile_id | tag_id

然后,查询可能如下所示:

代码语言:javascript
复制
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查询:

代码语言:javascript
复制
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')
   )
票数 2
EN

Stack Overflow用户

发布于 2013-02-13 17:26:14

理想情况下,您希望更多地规范您的数据库。创建一个名为Tags的新表,并拥有列tag_id和tag_name,将为您提供比多列更好的灵活性。例如,如果您希望一个帖子有100个或更多的标签,该怎么办?

创建一个控制posts和标记之间关系的新表(即post_tags)和另一个用于标记和用户(user_tags)的表将使您做得更好。

例如,您可以找到所有具有用户兴趣的帖子:

代码语言:javascript
复制
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的复合键,并检查您的查询是否有可能重复,等等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14859140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档