长时间的回答发现者,这里的第一次提问者。我试着寻找答案,但要么它不存在(令人怀疑),要么我似乎无法找到适当的术语来搜索(最有可能)。
我使用PHP / PDO从MariaDB数据库中获取数据。数据库具有多对多关系的表和它们之间的联结表,如下所示:
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
我使用LEFT OUTER JOIN选择活动及其与会者:
+----+-------------------------+------+------+
| 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 |
+----+-------------------------+------+------+
现在问题"是查询返回每个与会者的同一事件的倍数,如下所示:
preg_match("~[-\p{L}'\s,_/.]{2,30}$~u", $string, $matches);
现在我对结果的循环感到有些困惑。我想从结果中创建事件对象,但我只想将一个事件作为一个对象,将参与者添加到其中。
我可以遍历我的现有事件对象数组,并在检查结果集时检查id是否已经存在,但这似乎有点低效。是否有更优雅的解决方案,可能内置于PDO中?
答案 0 :(得分:2)
我会做这样的事情:
略微修改您的查询(现在我们有不同的活动名称和人名名称):
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'])
会给你回复
Array
(
[0] => Array
(
[0] => Bob
[1] => Anne
[2] => John
)
)
关于效率,我在这里看不到任何效率低下的线性复杂性。