【问题标题】:How to use a select statement to show 2 different foreign keys that reference the same foreign key?如何使用 select 语句显示引用相同外键的 2 个不同外键?
【发布时间】:2020-10-15 15:16:04
【问题描述】:

我有三个这样的表,


User
id | FName | Lname | Email
---+-------+-------+----------------------
1  | Bob   | Jim   | Bjim@email.com
2  | Smith | Jane  | gjane@email.com
3  | John  | Smith | Jsmith@email.com

post
id | description         | Title          | Postuser 
---+---------------------+----------------+----------
1  |   A large content   | A simple title | 2        
2  |   Small Content     |complex title   | 1        

Comments
id | Content             | Commentuser | CommentPost 
---+---------------------+-------------+-------------
1  |   A large content   | 2           |2
2  |   Small Content     | 1           |2

用户 ID 由 Commentuser 和 Postuser 引用。帖子id被commentPost引用

对于我的选择声明,我需要提供第二篇文章的标题、内容、作者的名字、作者的姓氏和该文章的作者电子邮件地址,以及在该文章中创建的任何 cmets 内容cmets 作者的名字、姓氏和电子邮件地址,结果为 2 行

帖子的用户与评论的用户不同,那么我如何选择两者来提供名字和姓氏?我在这里看到的其他链式连接不包括这种类型的东西,因为有 3 个表。我得到了

的骨架代码
Select Post.Content, ... 
FROM User,...,User AS Author 
WHERE ... AND Author.id = ...; 

编辑:预期结果

|Content              | Title          | PostFName | PostLname | PostEmail     | Comment Content| Comment Firstname|comment Lastname|
-------------------------------------------------------------------------------------------------------------------------------------
|   Small Content     |complex title   | Bob       | Jim       | BJim@email.com| A large content| Smith           | Jane           |
|   Small Content     |complex title   | Bob       | Jim       | BJim@email.com| A small content| John            | Smith          |

【问题讨论】:

  • 请在问题中包含预期的结果。
  • 你的概念是正确的,但是用户,...,用户是一个糟糕的设计,只使用内部连接而不是逗号分隔表
  • 要多次加入同一个表,请为每个源使用不同的别名。例如... FROM User post_user JOIN User commenter....
  • @TheImpaler 我添加了预期的结果
  • 请使用正确的JOIN。它已经存在超过 25 年了!!!

标签: mysql sql join inner-join


【解决方案1】:

可以多次加入用户表;你只需要使用别名来避免歧义:

select p.description, p.title, 
    pu.fname postfname, pu.lname postlname, pu.email postemail,
    c.content commentcontent,
    cu.fname commentfname, cu.lname commentlname, cu.email commentemail
from post p
inner join user pu on pu.id = p.postuser
inner join comments c on c.commentpost = p.id
inner join user cu on cu.id = c.commentuser

【讨论】:

  • 谢谢,这种方式行得通。我没有意识到加入用户两次,别名可以多次访问表。
猜你喜欢
  • 2021-12-13
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多