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

时间:2015-06-24 08:48:38

标签: php pdo mariadb

长时间的回答发现者,这里的第一次提问者。我试着寻找答案,但要么它不存在(令人怀疑),要么我似乎无法找到适当的术语来搜索(最有可能)。

我使用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中?

1 个答案:

答案 0 :(得分:2)

我会做这样的事情:

  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'];
    }
    
  3. 最后,您有一个存储事件和人员的关联数组。

    print_r($results['Company Christmas party'])会给你回复

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

    关于效率,我在这里看不到任何效率低下的线性复杂性。