在循环中使用sql查询

Rus*_*ust 1 php mysql

我在foreach循环中有一个查询,我觉得我不应该这样做.

我将如何改进此代码(这里我选择消息):

try{
    $sql="
    SELECT * FROM messages 
        WHERE workspace_id=:project_id
        ORDER BY message_created DESC
        LIMIT 20 
        OFFSET :offset";
    $stmt=$db->prepare($sql);
    $stmt->bindValue(':project_id', $project_id, PDO::PARAM_INT);
    $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
    $stmt->execute();
    $messages=$stmt->fetchAll(PDO::FETCH_ASSOC);
    }catch(Exception $e){echo $e->getMessage();}
Run Code Online (Sandbox Code Playgroud)

现在我需要用户姓名来自桌面users.我想不出另一种方式,但把它放在一个循环中.

foreach($messages as $row){ 
echo $row['message'];

$sql=  "SELECT first_name, last_name FROM users 
        WHERE user_id=:id 
        LIMIT 1";
        $stmt=$db->prepare($sql);
        $stmt->bindValue(':id', $row['sent_by']);
        $stmt->execute();
        $user=$stmt->fetch(PDO::FETCH_ASSOC);

echo $user['first_name'] . " " . substr($user['last_name'],0,1) . ".";
}
Run Code Online (Sandbox Code Playgroud)

这段代码的工作方式与我想要的方式相同,但看起来不应该以这种方式完成.

有人可以帮我从这里出去吗

小智 7

您可以执行SQL连接以完全避免foreach循环.

  try{
        $sql="
        SELECT messages.*, users.first_name, users.last_name
          FROM messages join users on messages.user_id = users.user_id
            WHERE workspace_id=:project_id
            ORDER BY message_created DESC
            LIMIT 20 
            OFFSET :offset";
        $stmt=$db->prepare($sql);
        $stmt->bindValue(':project_id', $project_id, PDO::PARAM_INT);
        $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
        $stmt->execute();
        $messages=$stmt->fetchAll(PDO::FETCH_ASSOC);
        }catch(Exception $e){echo $e->getMessage();}
Run Code Online (Sandbox Code Playgroud)

注意:我假设消息表具有用户ID并存储在"user_id"字段中.如果不同,请相应地更改字段名称.