【问题标题】:MySQL - Associating Single ID Number to Multiple ID NumbersMySQL - 将单个 ID 号关联到多个 ID 号
【发布时间】:2017-04-29 22:02:07
【问题描述】:

我有一个 JSON 文件,我将通过 PHP 程序运行它来填充 MySQL 数据库。

我拥有大部分数据库表和列,但我遇到了逻辑问题。

我正在处理会议,以及参加会议的人。

每个人要参加多个不同的会议,每个会议都有多人参加。

每个人都有一个唯一的 ID,每个会议都有一个唯一的 ID。

我的问题:

我知道我不能将每个人的多个 ID 放在一行中,因此我试图想办法将一个人的 ID 与多个会议 ID 关联起来,反之亦然。

最终,我希望能够运行查询,以返回某人正在参加的所有会议以及参加会议的人员。

以下是我为某人提供的信息的示例:

 "District": "Massachusetts District 1",
  "Email": null,
  "FirstName": "Lynn",
  "Id": 14869,
  "LastName": "Aaronson",
  "MeetingIds": [
    15650,
    15651,
    15652,
    15653,
    15654,
    15655,
    15656,
    15657,
    15658,
    15659,
    15660
  ]
},

这是一个会议:

{
  "AddressLine1": "717 Hart Senate Office Building",
  "AddressLine2": "120 Constitution Avenue, NE",
  "CongressPersonID": 8766,
  "CongressPersonStateDistrict": "WI",
  "ConstituentIds": [
    14810,
    14811
  ],
  "End": "2014-05-08T10:15:00.0000000-04:00",
  "Id": 15898,
  "Location": "SH717 ",
  "MeetingWith": "Kathleen Laird",
  "Name": "Sen. Tammy Baldwin",
  "PhoneNumber": "(202) 224-5653",
  "Start": "2014-05-08T10:00:00.0000000-04:00",
  "Status": "Confirmed"
},

【问题讨论】:

  • 与会者表(meeting_id,attendee_id)
  • 将该关系存储在第三个表中,该表具有meeting_idperson_id 列。然后,您可以使用该表查找特定person_id 参加的所有meeting_ids,或查找参加特定meeting_id 的所有person_ids。
  • @rickdenhaan 这就是我的想法,但我不会手动将person_ids 与meeting_ids 关联。这就是我卡住的地方。所有的数字都将被倾倒在那里。也许我可以想出一个 PHP 函数来将它们关联到第三个表中。
  • 不需要 PHP 函数,您可以在 SQL 查询中使用 JOIN 来检索所有参加过会议的人,或某个人参加过的所有会议。我将在答案中给出一个示例,因为这些更适合多行代码示例。

标签: php mysql logic relational-database


【解决方案1】:

扩展我的comment,基本原理是这样的。现在请记住,这是我不经意间写下的未经测试的代码,我在这里做了很多假设,比如使用 PDO 和准备好的语句,并且您已经有在 people 中插入数据的查询和meetings 表,更不用说 JSON 数据的结构了。

您必须对其进行调整以使其适合您的具体情况,此示例只是为了说明我将如何解决此问题的概念。

导入脚本:

$data = json_decode($json_data, true);

foreach ($data['meetings'] as $meeting) {
    // insert meeting details into `meetings` table
    $stmt = $db-prepare('INSERT INTO `meetings` ...');
    $stmt->execute(array(...));
}

foreach ($data['people'] as $person) {
    // insert person details into `people` table
    $stmt = $db->prepare('INSERT INTO `people` ...');
    $stmt->execute(array(...));

    foreach ($person['MeetingIds'] as $meetingId) {
        // insert attendance into `attendees` table
        $stmt = $db->prepare('INSERT INTO `attendees` (`person_id`, `meeting_id`) VALUES (:person_id, :meeting_id)');
        $stmt->execute(array(':person_id' => $person['Id'], ':meeting_id' => $meetingId));
    }
}

那么你需要在哪里获取详细信息:

// fetch a specific person
$stmt = $db->prepare('SELECT * FROM `people` WHERE `id` = :id');
$stmt->execute(array(':id' => $person_id));
$person = $stmt->fetch(PDO::FETCH_ASSOC);

// fetch all meetings for this person
$stmt2 = $db->prepare('
    SELECT     `meetings`.*
    FROM       `attendees`
    INNER JOIN `meetings`
    ON         `meetings`.`id` = `attendees`.`meeting_id`
    WHERE      `attendees`.`person_id` = :person_id
');
$stmt2->execute(array(':person_id' => $person['id']));
$meetings = $stmt2->fetchAll(PDO::FETCH_ASSOC);

如果你有一个会议并且你需要找到所有参加会议的人,你可以反过来做同样的事情。

我没有在实际数据库上测试这个JOIN,所以如果它的工作方式与我写的完全不一样,请不要感到惊讶。如果有错误,我相信有人会纠正我:-)

【讨论】:

    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 2015-07-30
    • 2017-11-23
    • 2016-04-22
    • 1970-01-01
    • 2023-03-04
    • 2012-06-27
    • 2016-12-22
    相关资源
    最近更新 更多