如何使用 PHP / PDO 有效处理 LEFT OUTER JOIN 结果

How to handle LEFT OUTER JOIN results efficiently with PHP / PDO

找了很久的答案,第一次在这里提问。我试着寻找这个问题的答案,但要么它不存在(有疑问),要么我似乎无法想出合适的术语来搜索(很可能)。

我正在使用 PHP / PDO 从 MariaDB 数据库获取数据。数据库有 table 个多对多关系,它们之间有一个连接 table,如下所示:

people            attendees           events
+----+------+     +------+------+     +----+-------------------------+
| id | name |     | p_id | e_id |     | id | name                    | 
+----+------+     +------+------+     +----+-------------------------+
|  1 | Bob  |     |    1 | 1    |     |  1 | Company Christmas party |
|  2 | Anne |     |    2 | 1    |     |  2 | Christmas party cleanup |
|  3 | John |     |    3 | 1    |     |  3 | John's birthday party   |
+----+------+     |    3 | 3    |     +----+-------------------------+
                  +------+------+

我正在使用 LEFT OUTER JOIN select 活动及其参与者:

SELECT events.id, events.name, people.id, people.name
FROM events
LEFT OUTER JOIN attendees
  ON events.id = attendees.e_id
LEFT OUTER JOIN people
  ON attendees.p_id = people.id

现在 "problem" 是为每个与会者查询 returns 相同事件的倍数,如下所示:

+----+-------------------------+------+------+
| id | name                    | id   | name |
+----+-------------------------+------+------+
|  1 | Company Christmas party |    1 | Bob  |
|  1 | Company Christmas party |    2 | Anne |
|  1 | Company Christmas party |    3 | John |
|  2 | Christmas party cleanup | NULL | NULL |
|  3 | John's birthday party   |    3 | John |
+----+-------------------------+------+------+

现在我有点受困于循环遍历结果。我想根据结果创建事件对象,但我只想将一个事件作为一个对象,并向其中添加与会者。

我可以遍历我的现有事件对象数组,并在遍历结果集时检查 id 是否已经存在,但这似乎有点低效。是否有更优雅的解决方案,可能内置于 PDO 中?

我会这样做:

  1. 稍微修改您的查询(现在我们对事件名称和人名有不同的名称):

    SELECT events.id, events.name as event, people.id, people.name as person
    FROM events
    LEFT OUTER JOIN attendees
        ON events.id = attendees.e_id
    LEFT OUTER JOIN people
        ON attendees.p_id = people.id
    
  2. 并将结果解析为数组:

    //$queryResult is the result returned by your query
    while($row = $queryResult->fetch(PDO::FETCH_ASSOC)) {
        $results[$row['event']][] = $row['person'];
    }
    

最后,您有一个存储事件和人物的关联数组。

print_r($results['Company Christmas party']) 会 return 你

Array
(
    [0] => Array
        (
            [0] => Bob
            [1] => Anne
            [2] => John
        )

)

关于效率,我在这里没有看到任何低效,线性复杂度。