用于获取用户帖子的SQL查询

时间:2012-01-06 21:33:15

标签: mysql sql database database-design relational-database

我被困在一个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 - 这是用于存储所有思考项目的表格,将有用于存储每种类型项目的单独表格,例如photovideo等:

    • 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查询来完成它。还建议对架构进行一些改进。

1 个答案:

答案 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;

这是一个起点。