2016-05-16 61 views
0

我有四个表其评论和回复选择的故事,并检查当前用户喜欢或不一个单一查询

帖子:

post_id  title Userid description 
1   test  20   TEXT 

评论:

comment_id  post_id Userid content 
1    1   5  TEXT 
2    1   36  TEXT 
3    1   6  TEXT 

回复

reply_id  comment_id Userid content 
1    1   4  TEXT 
2    2   5  TEXT 
3    2   30  TEXT 

喜欢:

post_id  Userid 
1   5 

该网站开始在数据库中的最后20个故事中..现在假定用户ID(5)登录,例如post_id(1)显示为喜欢,所有帖子都会显示他们的评论和回复。我想在一个查询中完成,而不是在循环内嵌套循环。

我的代码:

$sql1 = $conn->prepare("SELECT * FROM posts ORDER BY post_id DESC LIMIT 20"); 
$sql1->execute(); 
    while($row1=$sql1->fetch(PDO::FETCH_ASSOC)){ 
     .... 
     // <div class="post" id="<?php echo row1['post_id']; ?> </div> 
     . 
     . 
     .... 
     $sql2 = $conn->prepare("SELECT * FROM comments WHERE post_id=:post_id"); 
     $sql2 ->bindValue(':post_id', $row1['post_id']); 
     $sql2 -> execute(); 
     while($row2=$sql2 -> fetch(PDO::FETCH_ASSOC)){ 
       .... 
       // <div class="comment" id="<?php echo row2['comment_id']; ?> </div> 
       . 
       . 
       .... 
       $sql3 = $conn->prepare("SELECT * FROM replies WHERE comment_id=:comment_id"); 
       $sql3 -> bindValue(':comment_id', $row2['comment_id']); 
       $sql3 ->execute(); 
        while($row3=$sql3 ->fetch(PDP::FETCH_ASSOC)){ .... } 

     } 
     $sql_like=$conn->prepare("SELECT * from likes WHERE post_id = $row1['post_id'] AND user_id=$logged_user_id"); 
      $sql_like->execute(); 
      $sql_like->rowCount() > 1 ? //userlikes : //user does not like ; 
    } 

回答

1

你的问题是不是100%清楚,但你可以从像这样开始:

$sql1 = $conn->prepare("SELECT p.*, 
       c.comment_id, 
       r.reply_id, 
       COUNT(DISTINCT l.post_id) likes 
      FROM (SELECT 
       FROM posts 
       ORDER BY post_id DESC LIMIT 20 
      ) p 
      LEFT JOIN comments c 
      ON p.post_id = c.post_id 
      LEFT JOIN replies r 
      ON c.comment_id=r.comment_id 
      LEFT JOIN likes l 
      ON l.post_id = p.post_id 
       AND l.user_id=$logged_user_id"); 
$sql1->execute(); 
    $last_post_id = 0; 
    $last_comment_id = 0; 
    while($row = $sql1->fetch(PDO::FETCH_ASSOC)){ 
    if ($last_post_id != row['post_id']) { 
     echo '<div class="post" id="'.$row['post_id'].'>'.$row['post_id'].'</div>'; 
     echo '<div class="like">'.$row['likes'].'</div>'; 
     ... 
     $last_post_id = row['post_id']; 
     $last_comment_id = 0; 
    } 
    ... 
    if ($last_comment_id != $row['comment_id']) { 
     echo '<div class="comment" id="'.$row['comment_id'].'>'.$row['comment_id'].'</div>'; 
     $last_comment_id = $row['comment_id']; 
    } 
    ...     . 
    echo '<div class="reply" id="'.$row['reply_id'].'>'.$row['reply_id'].'</div>'; 

    } 
+0

谁说你这个解决方案将呼应只有一个评论?你是否试图运行它? – Alex

+0

非常感谢!完美的工作^^ –

+0

顺便说一下,喜欢表可能有许多记录与user_id相同的post_id和许多记录,但post_id和user_id组合在唯一的不同记录中,所以我想在爱情语句中有一个问题。 –

0

你可以使用子查询来算,从登录的用户在匹配后的ID喜欢表喜欢。

SELECT *, 
    (SELECT COUNT(*) FROM likes l WHERE l.post_id=p.post_id AND user_id = '$logged_user_id') AS userlikes 
    FROM posts p ORDER BY p.post_id DESC LIMIT 20