如何使用 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 中?
我会这样做:
稍微修改您的查询(现在我们对事件名称和人名有不同的名称):
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
并将结果解析为数组:
//$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
)
)
关于效率,我在这里没有看到任何低效,线性复杂度。
找了很久的答案,第一次在这里提问。我试着寻找这个问题的答案,但要么它不存在(有疑问),要么我似乎无法想出合适的术语来搜索(很可能)。
我正在使用 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 中?
我会这样做:
稍微修改您的查询(现在我们对事件名称和人名有不同的名称):
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
并将结果解析为数组:
//$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
)
)
关于效率,我在这里没有看到任何低效,线性复杂度。