【问题标题】:Can I use INNER JOIN on two columns of a table, refering to same Primary key of another table?我可以在表的两列上使用 INNER JOIN,引用另一个表的相同主键吗?
【发布时间】:2018-02-19 16:18:31
【问题描述】:

所以我有一个简单的 DB_Schema,USER_INFO 表,列 用户名和全名用户名是这个表的主键。 我正在建立一个简单的聊天网站。我还有一个 MESSAGES 表,它有 4 列,

  • 自动生成的消息 ID - 主键
  • SENDER - REFERENCES USER_INFO 表的用户名
  • RECEIVER - REFERENCES USER_INFO 表的用户名
  • MESSAGE - 发送的消息字符串

我试图使用 INNER JOIN 获取消息、发件人(全名)和收件人(全名)的详细信息,我的 SQL 查询是:

选择消息,发送者,user_info.name 作为发送者,接收者,user_info.name 作为接收者
FROMlets_chat.privatechat
INNER JOIN user_info ON privatechat.sender = user_info.username
INNER JOIN user_info ON privatechat .receiver = user_info.username;

这导致了一个错误:ERROR CODE 1066: Not Unique Table/alias: 'user_info'
有人可以帮我纠正我的错误或让我得到正确的 SQL 语句来执行此操作?我使用 MYSQL DB

我擅长 SPRING-HIBERNATE 并且我能够正确地做到这一点,只需要 SQL 的帮助。 提前致谢

更新答案

选择 PVC.message,UI1.name 作为发送者,UI2.name 作为接收者
FROMlets_chat.privatechat AS PVC
内部联接 user_info AS UI1 ON UI1.username = PVC.sender
UI2.username = PVC.receiver 上的 INNER JOIN user_info AS UI2;

这行得通。谢谢@plaidDK

【问题讨论】:

  • 您需要为每个表引用添加一个唯一的别名。 IOW、user_info ui1 和 user_info ui2

标签: mysql sql join inner-join


【解决方案1】:

您需要为您的联接提供一个唯一别名,并将您的列引用到您的表别名,可能是这样的:您可以将列更正为正确的表别名,因此我不知道列的来源

SELECT PVC.message, PVC.sender, UI1.name as sender, PVC.receiver, UI2.name as 
receiver 
FROM lets_chat.privatechat AS PVC
INNER JOIN user_info AS UI1 ON privatechat.sender = UI1.username 
INNER JOIN user_info AS UI2 ON privatechat.receiver = UI2.username;

【讨论】:

  • 对不起,我忘了通知,DB Schema 的名称是lets_chat。作为此模式一部分的两个表是 User_Info 和 PrivateChat,它们存储消息。发送者和接收者列被引用到 user_info 表的相同主键。 (即 User_info 的用户名)。对于上述查询,内部联接为发送者和接收者列提供了相同的值。 (即仅发件人姓名显示在发件人和收件人列中)。
  • 是的!然后,您只需确保您的别名是您需要的列前面的正确别名:)
  • 好的。我是 SQL 新手,我已将我的语句更正如下:SELECT privatechat.message, UI1.name as sender, UI2.name as receiver FROM lets_chat.privatechat INNER JOIN user_info AS UI1 ON privatechat.sender = user_info.username JOIN user_info AS UI2 ON privatechat.receiver = user_info.username; 但现在它显示错误 1054: unknown column user_info.username' in 'ON CLAUSE'。
  • 抱歉,您还需要在 ON 子句中更改您的别名 INNER JOIN user_info AS UI1 ON privatechat.sender = UI1.username INNER JOIN user_info AS UI2 ON privatechat.receiver = UI2.username;跨度>
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多