2012-01-06 82 views
0

我被困在SQL查询中。这是关于获取帖子以显示用户,这是由与他连接的人共享的。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的内容: - 在id

    • post_id (int p_key)shared表将插入此

    • public (bool) - 如果该值为true,这是一条公开信息,并能与大家

    • friends (bool)共享 - 如果为true,这个职位可以与人分享谁与谁张贴

    • relative (bool)的一个朋友 - 同上亲戚

    • colleague (bool) - 同为同事

    • classmates(bool) - 同为同学

    • acquaintance (bool) - 同为熟人

现在的问题是,我想取前20名的帖子这是公开的或共享连接到用户的人。用户只能看到他有权访问的帖子,以及哪些帖子来自他的联系人列表。你能告诉我怎么用单个或多个Sql查询来完成它。也建议在模式中进行一些改进。

+0

这听起来更像是“请执行我的设计”,而不是“请帮助我,我有这个技术问题”。这个论坛更多的是关于后一种请求。我建议发布迄今为止已尝试过的内容,我们可以帮助您解决更具体的问题。 – Milimetric 2012-01-06 21:38:41

+0

你使用的是什么db – 2012-01-06 22:34:49

+0

我正在使用MySql – Sourabh 2012-01-07 09:34:47

回答

0

首先,一些架构的建议 - 修改 '关系' 表是:

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 

三 - 在“共享”变化到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; 

这是一个起点。