2012-01-06 107 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; 

這是一個起點。