2015-11-25 3 views
1

У меня есть запрос в моем цикле foreach, и я чувствую, что не должен этого делать.Использование sql-запросов в цикле

Как будет идти об улучшении этого кода (Здесь я выбираю сообщения):

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) . "."; 
} 

Этот код работает так, как я хочу, но не похоже, что это должно быть сделано таким образом.

Может кто-нибудь помочь мне здесь

+2

Вы пытаетесь получить сообщение, связанное с сообщением конкретно? Если это так, мы можем просто выполнить 'join' в' sent_by', соответствующем столбцу 'id' от пользователей. например: 'LEFT JOIN users on users.id = messages.sent_by' – Ohgodwhy

+0

Почему бы просто не присоединить пользователей к сообщениям? – GordonM

+0

Спасибо! Прекрасно работает! Но теперь я должен указать все столбцы для выбора, потому что у пользователя более 30 столбцов, и мне просто нужно два. Ну, гораздо лучше сделать это так, а затем цикл – user3284463

ответ

7

Вы могли бы сделать SQL присоединиться, чтобы полностью избежать петли Еогеасп.

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

Примечание: Я принимаю, что таблица сообщений имеет идентификатор пользователя и хранится в поле «user_id». Соответственно измените имя поля, если оно отличается.

+0

Глядя на исходный код, я думаю, что столбец идентификатора пользователя в его таблице сообщений называется sent_by. В противном случае это правильный подход. – GordonM

Смежные вопросы