2014-01-31 2 views
0

У меня есть запрос, настроенный для возврата комментариев от одного пользователя другому.Добавить много-ко-многим в существующий запрос

Теперь мы хотим дать возможность оценить эти комментарии.

Я добавил новую таблицу с тремя полями: comment_id, user_id и оценка.

Как я могу захватить массив {user_id, score} для любого комментария?

Нужно ли мне прокручивать комментарии после их получения и запускать второй запрос? Такой подход может привести к добавлению нескольких дополнительных запросов.

Можно ли сделать один запрос?

Вот функция у меня сейчас:

function getAllComments($args) { 
    if(empty($_SESSION['user']['id'])) return false; 
    $limit = 5; 
    if(isset($args['limit'])) $limit = $args['limit']; 
    $page = 1; 
    if(isset($args['page'])) $page = $args['page']; 
    $data = array(); 
    $offset = ($page-1)*$limit; 

    $sql = "SELECT c.*,CONCAT(u1.firstName,' ',u1.lastName) AS owner,u1.title AS ownerTitle,CONCAT_WS(' ',u2.firstName,u2.lastName) AS senderName,u2.title AS senderTitle,a.name AS actionName,a.behavior 
    FROM comment AS c 
    JOIN user AS u1 ON c.recipient = u1.id 
    JOIN user AS u2 ON c.sender = u2.id 
    JOIN action AS a ON c.action = a.id 
    WHERE c.type=1"; 

    if(isset($args['location'])) $sql .= " AND u1.location=?"; 
    $sql .= " ORDER BY date DESC"; 
    $sql .= " LIMIT ?"; 
    $sql .= " OFFSET ?"; 

    try { 
    $db = DB::getInstance(); 
    $stmt = $db->dbh->prepare($sql); 
    $n = 1; 
    //THESE MUST STAY IN THE SAME ORDER TO MATCH THE ? PLACEHOLDERS 
    if(isset($args['location'])) $stmt->bindValue(($n++), $args['location'], PDO::PARAM_INT); 
    $stmt->bindValue(($n++), $limit, PDO::PARAM_INT); 
    $stmt->bindValue(($n++), $offset, PDO::PARAM_INT); 
    $result = $stmt->execute(); 
    $stmt->setFetchMode(PDO::FETCH_ASSOC); 
    $rows = array(); 

    if($result !== false) { 
     while($row = $stmt->fetch()) { 
     $rows[] = $row; 
     } 
     $data['comments'] = $rows; 
     return $data; 
    }else { 
     logit('Query Failed'); 
     return false; 
    } 
    }catch(PDOException $e) { 
    logit($e->getMessage()); 
    return false; 
    } 
} 

ответ

0

Если вы, например, хотел все {comment_id, user_id, счет}, связанный с комментариями пользователей 5, ваш запрос будет включать внутреннее соединение и посмотреть что-то вроде :

SELECT s.comment_id, s.user_id, s.score FROM CommentScore s 
INNER JOIN Comment c 
ON c.comment_id = s.comment_id 
WHERE c.user_id = 5 
Смежные вопросы