PHP PDO左连接多维数组

PHP PDO左连接多维数组,php,mysql,pdo,Php,Mysql,Pdo,基本上,我有三张桌子。我有一个项目表、一个问题表和一个答案表。一个项目可以有很多问题,一个问题可以有很多答案。使用问题ID上的PDO和LEFT JOIN,如何将带有答案的注释转换为多维数组,以便结构如下所示: [Question] => Array ( [id] => 1 [question] => 'Random Question' [askedBy] => 123 [answer] => A

基本上,我有三张桌子。我有一个项目表、一个问题表和一个答案表。一个项目可以有很多问题,一个问题可以有很多答案。使用问题ID上的PDO和LEFT JOIN,如何将带有答案的注释转换为多维数组,以便结构如下所示:

[Question] => Array
    (
        [id] => 1
        [question] => 'Random Question'
        [askedBy] => 123
        [answer] => Array
            (
              [0] => Array
                 (
                   [id] => 1
                   [answer] => 'An Answer'
                   [answeredBy] => 123
                 )
               [1] => Array
                 (
                   [id] => 1
                   [answer] => 'Another Answer'
                   [answeredBy] => 123
                 )
            )
      )
最终确定的代码(返回我想要的)


在一个查询中,您可以请求所有答案,将问题关联到答案,并将项目关联到问题

  • 创建空数组
    $projects=array()
  • 迭代每个结果行
    foreach($row作为$row的行)
  • 将项目及其数据添加到数组中,如果该项目不存在(使用项目id作为键)
    if(!isset($projects[$row->project\u id]){$projects[$row->project\u id]=array('col1'=>$row->col1,'questions'=>array());}
  • 将问题及其数据添加到project questions数组,如果它不存在(使用问题id作为键)
    if(!isset($projects[$row->project_id]['questions'][$row->question_id]){$projects[$row->project_id]['questions'][$row->question_id]=array('col2'=>$row->col2,'answers'=>array())}
  • 将答案及其数据添加到项目问答数组(使用答案id作为键)
    $projects[$row->project\u id]['questions'][$row->question\u id]['answers'][$row->answer\u id]=array('col3'=>$row->col3)
  • 但正如您所理解的,您将在该查询中获得许多无用的信息。您可以使用一个查询,仅获取项目,对其进行迭代,在每个周期中向数组添加数据,然后再次查询以获取具有特定项目id的问题,对其进行迭代,在每个周期中向数组添加数据,然后再次查询以获取具有特定问题id的答案,对其进行迭代,然后向数组添加数据

    但如果我重新考虑这个问题,我认为MySQL将比PHP工作得更快,即使返回大量无用的数据(我的意思是,重复关于项目和问题的数据),1次查询与可能来自一个客户机的50次查询相比要好得多,所以我建议最好使用第一种方法

    如果没有关于数据库表和列的更多信息,您只能从我这里得到伪代码算法

    编辑:可能的MySQL选择查询:

    SELECT 
        a.id answer_id, a.answer, a.answeredBy, 
        q.id question_id, q.question, q.askedBy, 
        p.id project_id, p.title
    FROM answer a
    LEFT JOIN question q ON q.id = a.question_id
    LEFT JOIN project p ON p.id = q.project_id
    
    表结构

    • 项目->id |标题|
    • 问题->| id |问题|由|项目| id提出|
    • 答案->id |答案|回答者|问题| id|

    多个查询可能会让您受益匪浅。使用一个来获取问题,然后使用另一个来获取每个问题的答案。@RocketHazmat建议的不是一个好的选择,因为您正在显著增加MySQL的负载。这可能会导致响应时间增加,特别是当数据库和web服务器不在同一台服务器上时。我喜欢这段代码,并且几乎可以正常工作,但是我想知道我们是否可以通过设置一个保存问题ID的变量,并在问题ID发生变化时创建一个新问题来提高效率,而不是每次都检查数组以查看是否有问题set@JohnHargis它已设置为将问题id作为数组键。需要检查问题是否已经存在,因为您可以用空答案数组覆盖现有问题。我将向问题中添加最终代码,减去项目表。让我知道是否有任何方法可以打破它。@JohnHargis如果我的回答是有帮助的,那么我会很感激,你把它标记为一个。
    SELECT 
        a.id answer_id, a.answer, a.answeredBy, 
        q.id question_id, q.question, q.askedBy, 
        p.id project_id, p.title
    FROM answer a
    LEFT JOIN question q ON q.id = a.question_id
    LEFT JOIN project p ON p.id = q.project_id