MySQL中的转换(多对多连接)表;允许重复条目将1列链接到不同表中的多个其他列

好的,所以我将尝试尽可能具体,但我的MySQL技能非常弱.所以情况如下:

我有2张桌子:捐赠者和学生.捐赠者可以与他们想要的尽可能多的学生联系,每个学生可以与捐助者想要“声称”他们的捐助者联系.因此,如果我有一个学生莎莉,她可以让吉姆,一个捐赠者,杰夫,一个捐赠者,与她联系.所以,我把所有学生放在一张桌子上,把所有捐赠者放在另一张桌子里.我需要把它们放在一起,显示学生姓名,身份证和学生所有捐赠者的身份证.

目前我的表是:Donor与DonorID,FirstName,LastName,DonorType,StreetAddress等.然后学生:StudentID,FirstName,LastName和DonorID.但是,这只允许我将学生与一名捐赠者联系起来.所以,我想我需要制作一个转换表,允许我显示StudentID,FirstName(学生),LastName(学生)和DonorID,“声称”该学生并允许我复制StudentID和将不同的DonorID放在同一学生的第2,第3,第4,等等等条目中.

所以,我想我的问题是转换表如何在MySQL中运行;我相信我将需要使用JOIN功能并将两个表连接在一起但是在tizag.com上阅读之后我更加困惑.我使用过Access,当你创建一个转换表时,你可以从每个表中提取PK,并使用其他表中的两个键创建一个复合键,但我不太清楚如何在MySQL中这样做;它是否基本相同,我应该从每个表中拉出PK并将它们连接在第3个过渡表中?

最佳答案
马文是对的.

你需要三张桌子来解决这个问题.

捐赠者

DonorID
FirstName
LastName
DonorType
StreetAddress
etc. 

学生

 StudentID
 FirstName
 LastName
 etc.

那你需要Student_Donor.这通常称为连接表,并实现多对多关系.

StudentID   (PK)  (FK to Student)
DonorID     (PK)  (FK to Donor)
DonorOrdinal

如果StudentID = 5有四个ID = 6,7,11,15的捐赠者,那么你就有这些行

StudentId   DonorId   DonorOrdinal
    5         6          1
    5         7          2
    5        11          3
    5        15          4

DonorOrdinal列允许您指定学生的主要捐赠者和次要捐赠者.我无法从你的问题中看出这是多么重要,但能够订购这些东西是有帮助的.请记住这一点:正式来说,SQL SELECT查询以不可预测的顺序返回行,除非您还指定了ORDER BY.

如果您想展示您的学生及其捐赠者,您将需要以下查询:

      SELECT s.StudentID, s.FirstName, s.LastName, 
             sd.DonorOrdinal, 
             d.DonorType, d.DonorID, d.FirstName, d.LastName
        FROM student s
   LEFT JOIN student_donor sd ON s.StudentID = sd.StudentID
   LEFT JOIN donor d ON sd.DonorID = d.DonorID
    ORDER BY s.StudentID, sd.DonorOrdinal, d.DonorID

这将按照ID的顺序显示所有学生(无论是否有LEFT JOIN的捐赠者),然后按DonorOrdinal的顺序显示他们的捐赠者.

转载注明原文:MySQL中的转换(多对多连接)表;允许重复条目将1列链接到不同表中的多个其他列 - 代码日志