2013-02-14 47 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