4

好的,所以我将尝试尽可能具体,但我的 MySQL 技能相当薄弱。所以情况如下:

我有 2 张桌子:捐赠者和学生。一个捐赠者可以与他们想要的尽可能多的学生联系起来,并且每个学生可以与捐赠者想要“认领”他们的尽可能多的捐赠者联系起来。因此,如果我有学生 Sally,她可以让捐赠者 Jim 和捐赠者 Jeff 与她联系。因此,我将所有学生放在一张桌子上,将所有捐赠者放在另一张桌子上。我需要把它们放在一起,显示学生的姓名、身份证和学生所链接的所有捐赠者的身份证。

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

所以,我想我的问题是转换表在 MySQL 中是如何工作的?我相信我将需要使用 JOIN 函数并将两个表连接在一起,但在 tizag.com 上阅读了相关内容后,我更加困惑。我使用过 Access,当您创建转换表时,您可以从每个表中提取 PK 并使用其他表中的两个键创建复合键,但我不太确定如何在 MySQL 中执行此操作;它的工作原理是否基本相同,我应该从每个表中提取 PK 并在第三个转换表中将它们链接在一起?

4

2 回答 2

2

马文是对的。

您需要三张桌子才能完成此任务。

捐赠者

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 顺序显示所有学生(无论是否有捐赠者),然后按 DonorOrdinal 顺序显示他们的捐赠者。

于 2012-11-21T02:37:33.373 回答
0

是的,差不多。您所说的是多对多关系。您的捐助者表不应包含对学生表的引用(反之亦然)。您将需要一个包含 DonorId 和 StudentId 的新表(您称之为转换表)。这可以包含您的主键,或者您可以使用另一列作为主键,即 auto_increment。

于 2012-11-21T00:42:39.067 回答