如何处理具有从 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 的查询检查您是否正在使用这些索引。
我正在使用以下查询来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 的查询检查您是否正在使用这些索引。