按评论数量订购帖子

时间:2016-07-20 10:52:45

标签: php sql pdo

我正在尝试使用一些过滤器创建一个简单的搜索系统,其中一个过滤器是按“受欢迎程度”排序,这基本上会将评论最多的帖子放在最前面的帖子中。 我有2个表,一个用于包含所有帖子(标题,内容,图像,postId)的帖子和一个包含所有评论的评论(内容和postId(用于验证评论来自哪个帖子))。 我的查询如下:

  $search = $db->prepare("SELECT comments.postId, comments.commentId, COUNT(comments.commentId) AS comms, posts.title, posts.postDate, posts.postId, posts.content,
                                 FROM comments, posts, users
                                 WHERE comments.postId = posts.postId AND posts.content LIKE ? OR posts.title LIKE ?
                                 GROUP BY comments.commentId
                                 ORDER BY comms DESC
                                 LIMIT 100");
            $search->execute(array("%$q%", "%$q%"));

要显示我使用的搜索结果:

foreach($search as $s) {
?>
  <a href="stream.php?viewPost=<?php echo $s['postId'];?>">
    <h5>
      <?php echo $s['title']; ?>
    </h5>
  </a>
  <small>Posted on <?php echo $s['postDate']; ?> </small>
  <div class="divider"></div>
<?php
}
             ?>

但是当我搜索某些内容时,它会显示1个帖子(实际上评论最多),而不是首先显示包含大多数评论的帖子。它会一遍又一遍地显示帖子。 如果我删除

GROUP BY comments.commentId

从查询中它只显示该帖子一次。

如果有人能告诉我这里我做错了什么,因为我真的没有看到它。

3 个答案:

答案 0 :(得分:1)

以下是一些观察结果:

  • 学习使用正确的,明确的JOIN语法。
  • 如果您想要退回帖子,请不要按评论ID进行分组。
  • 未使用users表格。

您想要的查询看起来更像:

SELECT p.postId, p.title, p.postDate, posts.postId, p.content,
       COUNT(c.commentId) AS comms, 
FROM posts p join
     comments c
     ON c.postId = p.PostId
WHERE p.content LIKE ? OR p.title LIKE ?
GROUP BY p.postId
ORDER BY comms DESC
LIMIT 100;

答案 1 :(得分:0)

SELECT p.postId, p.title, p.postDate, posts.postId, p.content,
       COUNT(c.commentId) AS comms, 
FROM posts p join
     comments c
     ON c.postId = p.PostId
WHERE p.content LIKE ? OR p.title LIKE ?
GROUP BY p.postId
ORDER BY comms DESC
LIMIT 100;

答案 2 :(得分:0)

从查询中删除users。你不能使用它:

SELECT COUNT(*) AS comms, comments.postId, comments.commentId, ...
FROM posts JOIN comments ON posts.postId = comments.postId
WHERE posts.content LIKE ? OR posts.title LIKE ?
GROUP BY posts.postId
ORDER BY comms DESC
LIMIT 100
相关问题