如何处理具有从 MySQL 到 PHP 的一对多关系的数据

How to process data with a one to many relation from MySQL into PHP

我正在使用以下查询来return关于一个习惯的数据。

一个习惯可以有很多步骤和很多评论。

当我运行以下查询时,它会重复每一步的习惯数据并在其中进行注释。

        SELECT 
        habit_id, habit_user_id, habit_name, habit_category_id, habit_description, habit_target_user, habit_up_votes, habit_down_votes, 
        step_id, step_description, 
        comment_id, comment_user_id, comment_description
        FROM habits, steps, comments 
        WHERE habit_id = ? 
        AND habit_id = step_habit_id
        AND habit_id = comment_habit_id
        ORDER BY step_order

示例输出(ID 应该足以了解正在发生的事情):

habit_id    step_id    step_description    comment_id    comment_description
1           1          do x                1             this works great!
1           1          do x                2             Awful!
1           1          do x                3             nice job
1           2          then do y           1             this works great!
1           2          then do y           2             Awful!
1           2          then do y           3             nice job

我希望能够获取这个 returned 数据并将其放在一个数组中。

array("habit_id" => 1, "step_id" => array(1, 2), "comment_id" => array(1, 2, 3));

我能想到的唯一方法是:

执行 3 个单独的查询 1 获取习惯数据,1 获取该习惯的步数,1 获取该习惯的评论。

按原样使用上述查询并用习惯数据构造一个新数组,然后遍历所有行并为步骤和评论构造一个新数组,同时确保没有添加了重复项。

这听起来效率太低了,任何人都可以通过修改我的查询以提供 PHP 更可行的数据或 PHP 中的一些技巧来提出更好的方法。我曾经考虑过将数据连接到查询中的步骤和注释的数组中,但我认为这应该是 PHP 以这种方式处理数据的工作。

我希望以这种方式获取数据的原因是 return 将其用于 Angularjs 应用程序。

我会这样做。如果这能解决您的问题,请告诉我。

<?php

$test = NULL;
$test['habit_id']= $habitID; // I assume $habit is known;
$query = "SELECT * FROM steps
        WHERE habit_id = '".$habitID."';";
$result= mysql_query($query, $con);
while($row=mysql_fetch_array($result))
    $test['step_id'][]=$row['step_id'];

$query= "SELECT * FROM comments 
        WHERE habit_id = '".$habitID."';";
$result= mysql_query($query, $con);
while($row=mysql_fetch_array($result))
    $test['comment_id'][]=$row['comment_id'];

var_dump($test);

?>

查询没有问题。它返回足够的数据供您迭代并构建所需的数组。

$data = array();

// could be any type of loop here. whatever returns data from your query
while($row=mysql_fetch_array($result)) {
    $data['habit_id'] = $row['habit_id'];

    // the in_array check ensures there are no dupes
    if (!in_array($row['step_id'], $data['step_id'])) {
        $data['step_id'][] = $row['step_id'];
    }
    if (!in_array($row['comment_id'], $data['comment_id'])) {
        $data['comment_id'][] = $row['comment_id'];
    }
}

这将比三个单独的查询更有效。确保您的数据库已正确编入索引。并通过 运行 使用 EXPLAIN 的查询检查您是否正在使用这些索引。