我被困在一个SQL查询上。这是关于获取帖子以显示用户,这是由与他相关的人共享的。
我有一个表格,显示两个用户之间的连接。两个用户之间可以有5种类型的连接:
任何两个用户都可以连接多个关系,因此该表有7列,分别为:
first_user_id (int)
second_user_id (int)
friends (bool)
relative (bool)
colleague (bool)
classmate (bool)
acquaintance (bool)
现在,用户可以分享帖子,可以是思想,照片,视频或其他任何内容,但就目前而言,我们可以考虑分享一个想法。他可以在帖子上设置隐私,他可以指定只有他的亲戚或朋友才能访问帖子。由于这个原因,我有三张桌子。
Shared
- 所有共享项目:
id (int auto_incr p_key)
;
type (text)
- 此行的帖子类型,例如。它可以是'thought'
,'photo'
或'video'
。现在,它将是'thought'
;
item_id (int)
- id
,目前,它是thought
表格;
shared_by (int)
- id
time (datetime)
- 发布思想的日期/时间
Thought
- 这是用于存储所有思考项目的表格,将有用于存储每种类型项目的单独表格,例如photo
,video
等:
id (int auto_incr p_key)
content (text)
- 思想的内容
Shared_with
:
post_id (int p_key)
- 此处将插入id
表的shared
值
public (bool)
- 如果此值为true,则为公开发布,可与所有人共享
friends (bool)
- 如果属实,则可以与发布该帖子的朋友分享此帖子
relative (bool)
- 与亲属相同
colleague (bool)
- 同事
classmates(bool)
- 同学一样
acquaintance (bool)
- 熟人相同
现在的问题是,我想要获取前20个帖子,这些帖子既可以是公开的,也可以是与用户相关联的人共享的帖子。用户应该只看到他有权访问的帖子以及来自他的联系人列表的帖子。你能建议我如何使用单个或多个Sql查询来完成它。还建议对架构进行一些改进。
答案 0 :(得分:0)
首先是一些架构建议 - 将'connections'表更改为:
UserId0
UserId1
RelationshipId
使用
创建查找表 RelationshipId
Description
其次 - 将'shared_with'表更改为:
PostId
Public
SharedWith (this should be a bitmask for the various types of relationships for this post)
另一个查找表:
SharedWithMask (1,2,4,etc)
SharedWithDescription
第三 - 将'shared'中的TypeOf更改为数字。文本查找可能是限制性的,也是一种痛苦。
在你的问题中,你没有提到成为“前20名”意味着什么,所以我们最近会选择20名。
select itemid from shared join connections on
shared.shared_by = connections.second_user_id join shared_with on
shared_with.post_id = shared.id where
connections.first_user_id = (person) and shared_with.public = true
order by shared.datetime limit 20;
这是一个起点。