我正在使用以下代码来查询
$statement = $conn->prepare('SELECT * FROM userFeeds WHERE userId = :userId ORDER BY creationDate ASC LIMIT 100');
$statement->bindParam(':userId' , $userId, PDO::PARAM_STR);
$statement->execute();
$posts = $statement->fetchAll(PDO::FETCH_ASSOC);
return array('Success'=>$row, 'Posts'=>$posts);
每个帖子都有以下内容,
id userId comment type date
我还希望获得每个帖子的UserInfo以及帖子的其他字段。
目前在JSON中我获得了上面的字段,但是如果我想添加一个额外的字段“user”并将用户传递给它,例如
foreach ($post in $posts)
{
// PERFORM A QUERY TO GET USER FROM post=>userId
$post['user'] = $user;
}
这个循环可能很长。我可以设法更有效地或仅在一个查询中执行某些操作吗?
答案 0 :(得分:1)
每当我遇到类似于此的内容时,下面的代码片段就是我如何解决它并减少查询次数的示例:
# build an array of user ids
$userIds = array();
foreach ($posts as $post) {
if (!in_array($post['userId'], $userIds)) {
$userIds[] = (int)$post['userId'];
}
}
# fetch these users.
$st = $conn->query('SELECT * FROM `users` WHERE `id` IN (' . implode(',', $userIds) . ')';
while ($row = $st->fetch(PDO::FETCH_ASSOC)) {
$users[] = $row;
}
# assign users to posts.
foreach ($posts as $index => $post) {
$posts[$index]['user'] = null;
foreach ($users as $user) {
if ($user['id'] == $post['userId']) {
$posts[$index]['user'] = $user;
break;
}
}
}
这样做的基本前提是您提取所有相关的用户ID,执行单个查询以查找相关用户,然后将这些用户重新分配回原始数组。