2013-12-11 43 views
0

我使用下面的代码来查询PHP查询加入多个表行

$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 

我也想与相处每个帖子的用户信息其他领域的职位。

目前在JSON我收到上述领域,但如果我想添加一个额外的字段“用户”,并通过用户给它e.g

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

这个循环可能是一个漫长的事情。我可以设法更有效率地完成某项操作吗?

+0

@ user876345任何示例都会很棒 –

+0

@ user876345是的但我想创建一个额外的字段“uf.user”并将该用户也分配给它:) –

+0

看看每个帖子都有自己的用户,我不会想要浪费时间来查询每个帖子以获取自己的用户,我想使它高效,因此可能是一个查询可以获取帖子并在其中添加字段“user”并获取添加帖子并附加到其“用户“字段 –

回答

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