连接多个表行的PHP查询


PHP query to Join multiple Table rows

我使用以下代码查询

 $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"并将user传递给它,例如

foreach ($post in $posts)
{
   // PERFORM A QUERY TO GET USER FROM post=>userId
    $post['user'] = $user;
}

这个循环可能很长。我能更高效地完成某些事情吗?还是只在一个查询中完成?

每当我遇到类似的事情时,下面的代码片段就是我如何解决它并减少查询数量的示例:

# 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,执行单个查询以查找相关用户,然后将这些用户重新分配回原始数组。