2013-02-27 111 views
0

我無法將幾個sql語句組合成一個更大的單一語句。外部和內部SQL加入

問題: 我有一個新聞源,需要返回登錄用戶關注的所有帖子。我還需要加入一個包含其他兩個表格的表格,以獲取新聞Feed中發佈的帳戶的用戶名。我有4個表,這將在該查詢中使用:

從動(具有帳戶的它遵循帳戶和類型被跟蹤列表用戶)

重要的列:[USER_ID,following_id,類型]

用戶(用戶可以按照其他用戶帳戶)

重要的列:[用戶名]

服務器(用戶也可以關注服務器帳戶。注意服務器對用戶是一對多的,因爲用戶可以創建0或多個服務器綁定到他們的帳戶)

重要的列:[標題]

News_Posts(這包含消息,帳戶類型(整數),以及poster_id)

重要的列:[poster_id,消息類型]

我無法弄清楚如何抓住對登錄用戶當前的新聞發佈。

查詢1:返回完整的新聞列表基於「類型」正確的用戶名0 =用戶,1 =服務器

SELECT news_posts.*, users.username FROM news_posts INNER JOIN users ON news_posts.poster_id=users.id WHERE news_posts.TYPE='0' 

UNION 

    SELECT news_posts.*, servers.title FROM news_posts INNER JOIN servers ON news_posts.poster_id=servers.id WHERE news_posts.TYPE='1' 

查詢2:返回帳戶的特定用戶(在1這種情況下ID)是以下

SELECT following_id, type FROM follower WHERE user_id='1' 

我將如何合併查詢1查詢2,這樣只有news_post記錄,其中news_posts.poster_id =查詢2的結果。它必須使正確的用戶名是用來

編輯考慮到跟隨的類型:這裏是架構的一個粗略的版本:http://sqlfiddle.com/#!2/a48f3/1

+0

模式公平的遊戲修改?例如,我可能會建議有一個帳戶表來存儲用戶和服務器;該表格將包含區分兩種(或更多)類型帳戶的類型列? – Alkini 2013-02-27 19:28:36

+0

仍處於原型階段,所以我很樂意提出改進架構的建議。此外,這是一個非常粗糙的(只有主列)架構,因此它可以可視化:http://sqlfiddle.com/#!2/a48f3/1 編輯:我目前允許帳戶有多個服務器,這就是爲什麼我結構化他們分開。所以這是一對多的關係。 – MCG 2013-02-27 19:30:49

回答

2

你問的是發表一個帳戶(用戶或服務器)是所有新聞帖子ID爲用戶遵循。您需要關於這些帖子的所有信息以及海報的用戶名或服務器標題。這是在SQL,給你的架構(also at sqlfiddle):

select p.*, 
    account.username 
from news_posts p 
    join 
     (
      select id, 
       username, 
       0 as type 
      from users 
      union 
      select id, 
       title, 
       1 as type 
      from servers 
     ) account 
     on (
      account.id = p.poster_id 
      and account.type = p.type 
     ) 
    join follower f 
     on (
      f.following_id = account.id 
      and f.type = account.type 
     ) 
where f.user_id = 1 

它不打兩次news_posts表的額外好處。

0

你的意思是這樣?

SELECT * FROM 
(
SELECT news_posts.*, users.username FROM news_posts INNER JOIN users ON news_posts.poster_id=users.id WHERE news_posts.type='0' 
    UNION 
SELECT news_posts.*, servers.title FROM news_posts INNER JOIN servers ON news_posts.poster_id=servers.id WHERE news_posts.type='1' 
) un, Follower f 
WHERE un.poster_id=f.following_id 

修改小提琴:http://sqlfiddle.com/#!2/a48f3/3

如果這不是你要找的人,請澄清您的要求。

+0

這非常接近,但我需要爲特定用戶所關注的所有用戶和服務器返回新聞帖子。目前只有poster_id與follow_id相同的地方。我需要一個地方來指定一個用戶ID(當前登錄的用戶ID)並返回他們關注的服務器和用戶的所有新聞帖子。 希望能讓它更清晰一點? 編輯:另外,它選擇從追隨者表和聯合的所有東西,但我只需要從聯合中選擇一切,因爲追隨者表僅用於匹配news_posts與用戶。 – MCG 2013-02-27 20:00:22

+0

@MCG - 可能您可以發佈您的小提琴示例的預期結果? – 2013-02-27 20:07:48

+0

我正在使用用戶名的聯合列尋找所有News_posts列(消息,類型,poster_id)。我想弄清楚如何從服務器和/或其他用戶中選擇當前登錄的用戶關注的並在追隨者表中表示的News_Posts。我不需要返回任何追隨者表格信息,因爲它僅用於檢查爲每個用戶檢索哪些news_posts。 編輯:查詢#1我粘貼返回我需要的所有東西,但它顯示所有的記錄,而不是唯一的服務器/用戶給定的user.id後面。 – MCG 2013-02-27 20:14:23