【问题标题】:Transition (many to many join) tables in MySQL; allowing for duplicate entries to link 1 column to multiple other columns in different tableMySQL 中的转换(多对多连接)表;允许重复条目将 1 列链接到不同表中的多个其他列
【发布时间】:2012-11-21 00:28:03
【问题描述】:

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

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

目前我的表格是:DonorID、FirstName、LastName、DonorType、StreetAddress 等的 Donor。然后是 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 并在第三个转换表中将它们链接在一起?

【问题讨论】:

    标签: mysql many-to-many


    【解决方案1】:

    马文是对的。

    您需要三张桌子才能完成这项工作。

    捐助者

    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 顺序显示他们的捐赠者。

    【讨论】:

    • 完美,非常感谢。对不起,如果我的问题令人困惑。不过这效果很好。
    • 欢迎来到 Stack Overflow。最令人困惑的问题是你不问的问题。要做的事情之一是“接受”对您的问题的有用答案——这有助于系统跟踪有用的答案。
    • 哈哈,谢谢您不接受。我刚刚阅读了一个不同的问题,我正在阅读人们对它的看法,所以我只是回到这里接受你的回答。再次感谢您的帮助
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-09-01
      • 2017-07-23
      • 2011-03-02
      • 2015-01-08
      • 2015-05-18
      • 2018-12-19
      • 2010-10-21
      • 2019-09-03
      • 1970-01-01
      相关资源
      最近更新 更多