【问题标题】:SQL query on multiple tables, one being a junction table对多个表进行 SQL 查询,其中一个是联结表
【发布时间】:2013-01-29 21:55:17
【问题描述】:

我有一个相当简单的数据库,由 4 个表组成:

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,有人可以帮我理解我做错了什么吗?

【问题讨论】:

  • 您是否尝试将DISTINCT 关键字添加到选择SELECT DISTINCT USERS.user_name, MESSAGES.message?但是如果每个用户都有重复的消息,在这种情况下DISTINCT 将不起作用,您必须决定选择哪条消息。那么在这种情况下,您希望为每个用户显示哪条消息?最新的?还是什么?
  • 三个表的示例数据和所需的输出将非常有帮助。
  • 啊,DISTINCT 成功了。我不知道那个关键词。我可能应该用不同的措辞...... MESSAGES 表中实际上没有重复的消息,而是我在结果中多次收到相同的消息,我假设是因为相同的用户 ID 可能会在 GROUP_MATRIX 中出现多次表。

标签: sql join junction-table


【解决方案1】:

SELECT 子句中使用关键字DISTINCT,如下所示:

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】:

    由于您只需要用户名和消息,因此您不想使用组和联结表。

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

    【讨论】:

    • 这也有效,我想我假设我需要通过我的联结表进行查询才能访问用户名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多