Php 在循环中运行多个查询,并构建多维数组
我正在根据用户跟踪的用户构建数据流。虽然我有一个工作原型,但代码看起来不必要的丑陋,因为多个循环中嵌套了进一步的查询。我想知道我是否可以得到任何关于简化此操作的建议,以及在sql查询本身中可能处理更多操作的建议?下面是一些代码:我已经对其进行了一些删减,并删除了一些检索到的行Php 在循环中运行多个查询,并构建多维数组,php,multidimensional-array,mysqli,union,Php,Multidimensional Array,Mysqli,Union,我正在根据用户跟踪的用户构建数据流。虽然我有一个工作原型,但代码看起来不必要的丑陋,因为多个循环中嵌套了进一步的查询。我想知道我是否可以得到任何关于简化此操作的建议,以及在sql查询本身中可能处理更多操作的建议?下面是一些代码:我已经对其进行了一些删减,并删除了一些检索到的行 $init = $conn->prepare("SELECT followerid FROM following WHERE userid=?"); $init->bind_param("s", $userid
$init = $conn->prepare("SELECT followerid FROM following WHERE userid=?");
$init->bind_param("s", $userid);
$init->execute();
$init->bind_result($idq);
$init->store_result();
$num = $init->num_rows();
while($init->fetch()) {
// get all to be done by each user
$stmt = $conn->prepare("SELECT activityId FROM done WHERE userId=? ORDER BY number DESC");
$stmt->bind_param("s", $idq);
$stmt->execute();
$stmt->bind_result($aiddo);
$stmt->store_result();
$num_do = $stmt->num_rows;
while($stmt->fetch()) {
$activityId_do[] = $aiddo;
}
// get location information
for($i=0; $i<=$num_do; $i++) {
$act_done = $conn->prepare("SELECT fullAddress FROM `activity` WHERE (id=?)");
$act_done->bind_param("s",$activityId_do[$i]);
$act_done->execute();
$act_done->bind_result($fullAddress);
while($act_done->fetch()) {
$do_array[] = array(
"fullAddress"=>$fullAddress,
"type"=>"do"
);
}
}
//get all done by each user
$stmt = $conn->prepare("SELECT activityId FROM done WHERE userId=? ORDER BY number DESC");
$stmt->bind_param("s", $idq);
$stmt->execute();
$stmt->bind_result($aid);
$stmt->store_result();
$num_done = $stmt->num_rows;
while($stmt->fetch()) {
$activityId[] = $aid;
}
for($i=0; $i<=$num_done; $i++) {
$act_done = $conn->prepare("SELECT fullAddress FROM `activity` WHERE (id=?)");
$act_done->bind_param("s",$activityId[$i]);
$act_done->execute();
$act_done->bind_result($fullAddress);
while($act_done->fetch()) {
$done_array[] = array(
"fullAddress"=>$fullAddress,
"type"=>"done"
);
}
}
//get all stories by each user
$stmt = $conn->prepare("SELECT activityId FROM story WHERE userId=? ORDER BY number DESC");
$stmt->bind_param("s", $idq);
$stmt->execute();
$stmt->bind_result($aidst);
$stmt->store_result();
$num_story = $stmt->num_rows;
while($stmt->fetch()) {
$activityId_story[] = $aidst;
}
for($i=0; $i<=$num_story; $i++) {
$act_done = $conn->prepare("SELECT fullAddress FROM `activity` WHERE (id=?)");
$act_done->bind_param("s",$activityId_story[$i]);
$act_done->execute();
$act_done->bind_result($fullAddress);
while($act_done->fetch()) {
$story_array[] = array(
"fullAddress"=>$fullAddress,
"type"=>"story"
);
}
}
}
有没有更好的方法来实现这一点?在这种情况下,这是构建多维数组的最佳方法吗 我会在数据库中为被跟踪的用户或其他人创建一个表,您可以将用户链接到他们跟踪的用户id,然后查询该表中的id列表,然后运行下一次查询以获取您正在提取的信息,或者,如果数据较小,则将该数据也存储到表中
=======================================
| id | user_id | following_id | type |
=======================================
| 1 | 101 | 12 | story |
| 2 | 108 | 15 | story |
| 3 | 108 | 16 | do |
| 4 | 108 | 19 | done |
=======================================
甚至可以添加地址,如果这就是你想要的,但一个很好的建议是,这不起作用,因为每个用户都可以拥有每个状态的项目。他们可以同时拥有他们正在做的、已经做过的项目,并为所有人添加一个故事。这就是为什么类型与返回的信息类型相关联。它的唯一用途是告诉javascript如何显示输出。您可以有多个具有相同用户标识的行,以及具有不同类型项的后续标识的行。。。这就是数据库的乐趣,我知道。但我不知道这将如何解决这个问题。事情就是这样,我只是想知道有没有更好的办法。将类型移动到第一个查询中似乎会使所有内容更加复杂。另外,我需要在下表中为活动表中的每个项目添加一个新行。关于在第一个循环中的查询上使用union,您所了解的是什么。例如:将完成的查询与位置信息查询联接起来?
=======================================
| id | user_id | following_id | type |
=======================================
| 1 | 101 | 12 | story |
| 2 | 108 | 15 | story |
| 3 | 108 | 16 | do |
| 4 | 108 | 19 | done |
=======================================