在循环

时间:2015-11-25 17:11:20

标签: 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();}

现在我需要来自表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) . ".";
}

这段代码的工作方式与我想要的方式相同,但看起来不应该像这样。

任何人都可以帮助我吗

1 个答案:

答案 0 :(得分: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();}

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