2013-02-14 62 views
2

我有一個相當簡單的數據庫,包括4個表:SQL查詢,一個是結表

Table 1: USERS 
Columns: userID, user_name 

Table 2: GROUPS 
Columns: groupID, group_name 

Table 3 (Junction Table): GROUP_MATRIX 
Columns: userID, groupID 

Table 4: Messages 
Columns: messageID, message, userID, groupID 

我想用下面的格式結果全部郵件的查詢:

user_name, message 

我形成像這樣的查詢:

SELECT USERS.user_name, MESSAGES.message 
FROM GROUP_MATRIX 
JOIN USERS on GROUP_MATRIX.userID = USERS.userID 
JOIN MESSAGES on GROUP_MATRIX.userID = MESSAGES.userID 

它有點工作,但我得到一些重複結果回來。看起來,如果user_ID不止一次出現在GROUP_MATRIX中,那就是當我得到該用戶的重複結果時。很明顯,我不明白我試圖做的JOIN,有人能幫我理解我做錯了什麼嗎?

+0

您是否嘗試過加入'DISTINCT'關鍵字的選擇'SELECT DISTINCT USERS.user_name,MESSAGES.message'?但是,如果每個用戶都有重複的消息,在這種情況下,「DISTINCT」將不起作用,您必須決定選擇哪個消息。那麼在這種情況下,您想要爲每個用戶顯示哪條消息?最新的?或者是什麼? – 2013-02-14 06:44:04

+0

另外,三個表格和所需輸出的示例數據將非常有幫助。 – 2013-02-14 06:48:21

+1

啊,DISTINCT做到了。我不知道那個關鍵詞。我也許應該有不同的措辭...... MESSAGES表中沒有實際重複的消息,而是我在結果中多次返回相同的消息,因爲相同的用戶ID可能會在GROUP_MATRIX中多次顯示錶。 – Axl 2013-02-14 06:56:25

回答

2

使用關鍵字DISTINCT這樣的SELECT子句中:

SELECT DISTINCT USERS.user_name, MESSAGES.message 
FROM GROUP_MATRIX 
JOIN USERS on GROUP_MATRIX.userID = USERS.userID 
JOIN MESSAGES on GROUP_MATRIX.userID = MESSAGES.userID; 
2

由於您只希望user_name和消息不想使用組和聯結表。

Select 
    us.user_name, msg.message 
    from Messages as msg 
    LEFT JOIN USERS as us ON (msg.userID = us.userID) 
    groupby msg.messageID 
+0

這也適用,我想我假設我需要通過我的聯結表來查詢以獲得對user_name的訪問權限。 – Axl 2013-02-14 07:14:45

+0

如果這工作,看起來很簡單,你可以接受這個答案。 – 2013-02-14 07:18:15