2017-08-18 65 views
1

我有一個: PostTable如何將子查詢的輸出追加到當前的主查詢中?

它具有VARCHAR 內容,以及INT 組ID


JoinedGroupsTable

它具有INT 用戶ID和INT GROUPID


在用戶加入時的基團,一個記錄被添加到具有用戶ID和GROUPID所述的groupId。

我想向數據庫發送一個查詢,以獲取具有用戶已加入的組ID的郵寄表的所有帖子。

這就是我想要做的事:

Select 
posttable.Content 
FROM 
posttable, joinedgroupstable 
WHERE posttable.GroupID = 
(SELECT GROUP_CONCAT(joinedgroupstable.GroupID SEPARATOR " OR posttable.GroupID =") 
FROM joinedgroupstable 
WHERE joinedgroupstable.UserID=1) 

這僅僅是一個示例代碼,它並沒有真正的工作,但因爲括號之間的最後部分。

這部分:

(SELECT GROUP_CONCAT(joinedgroupstable.GroupID SEPARATOR " OR posttable.GroupID =") 
    FROM joinedgroupstable 
    WHERE joinedgroupstable.UserID=1) 

將輸出類似 「1 OR posttable.GroupID = 2 OR posttable.GroupID = 3」 等,這取決於基團id,它們相鄰的joinedgroupstable用戶,我希望它的輸出連接到主查詢,以便它成爲這樣的事情:

Select 
posttable.Content 
FROM 
posttable, joinedgroupstable 
WHERE posttable.GroupID = 
1 OR posttable.GroupID =2 OR posttable.GroupID =3 

所以加入子查詢的輸出到主查詢。我不知道這是否可能,並想知道是否有更簡單的方法。

+0

使用in子句? (where)中的posttable.groupID或者WHERE中的posttable.groupID(SELECT GroupID FROM joinedgroupstable WHERE UserID = 1)' – xQbert

+0

'好吧,謝謝,我想我會用這個語法而不是幾個從現在開始。 編輯:但是,我的主要問題是從JoinedGroupsTable(這是用戶'1'加入的groupIDs)生成「1,2,3」,然後將它們添加爲(1,2,3)到主查詢 – Krestek

+0

看到我的答案格式來實現這一點。 – xQbert

回答

0

也許這就是你之後... 我不明白爲什麼你需要加入到joinedgroupstable,所以我把它從連接中刪除。在from子句中,請使用內,左,右連接符號而不是,表示法。

這種方法有時可能是緩慢的,並在所有當組ID爲null,在一個或兩個的情況下(尤其是在NOT in的情況下)

SELECT posttable.Content 
FROM posttable 
WHERE posttable.GroupID in (SELECT GroupID 
          FROM joinedgroupstable 
          WHERE UserID=1) 

的另一種方式做這將是不起作用加入表格然後限制。如果你需要來自兩個表的數據,這個效果很好。

SELECT posttable.Content 
FROM posttable 
INNER JOIN joinedgroupstable 
    on posttable.GroupID = joinedgroupstable.GroupID 
WHERE UserID=1 

或使用聯合查詢並存在。

這樣可以很好地處理空值,特別是在不使用或不存在時。

SELECT pt.Content 
FROM posttable pt 
WHERE Exists (SELECT * 
       FROM joinedgroupstable jgt 
       WHERE UserID=1 
       AND pt.groupID = jgt.groupID) 

在不同的引擎中各有各的長處和短處,並根據數據的不同而有所不同。你必須測試以找到最適合你的工作;但是所有3個應該產生相同的結果(除了在無效情況下)

+0

正是我需要的! 編輯:好吧我一直按住輸入鍵而不是按住Shift鍵輸入我必須習慣它XD 非常感謝! – Krestek

+0

這是一個提問和獲取答案的geat站點:只要確保提供一個完整的[MCVE](https://stackoverflow.com/help/mcve),然後在提出問題之前考慮[首先與鴨子交談]( https://blog.codinghorror.com/rubber-duck-problem-solving/)。是的,我很認真。 要生成一個不錯的[ascii表](https://ozh.github.io/ascii-tables/)數據的問題或模擬日期和問題使用http://rextester.com/ – xQbert

+0

啊好吧然後,將請閱讀它,並在下次提問時考慮它,謝謝! – Krestek