【问题标题】:Order posts by amount of comments按评论数量排序帖子
【发布时间】:2016-07-20 20:00:49
【问题描述】:

我正在尝试使用一些过滤器制作一个简单的搜索系统,其中一个过滤器是按“流行度”对它们进行排序,这基本上会将具有最多 cmets 的帖子放在最前面,而将 cmets 最少的帖子放在最后。 我有 2 个表,一个用于包含所有帖子(标题、内容、图像、postId)的帖子,另一个用于包含所有 cmets(内容和 postId(以验证评论来自哪个帖子)的 cmets。 我的查询看起来像:

  $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
}
             ?>

但是当我搜索某些内容时,它不是首先显示具有最多 cmets 的帖子,而是显示 1 个帖子(实际上具有最多 cmets)。它将一遍又一遍地显示该帖子。 如果我删除

GROUP BY comments.commentId

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

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

【问题讨论】:

    标签: php sql pdo


    【解决方案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;
    

    【讨论】:

    • @SirMaxime 。 . .那么,我假设where 子句没有匹配项。
    【解决方案2】:

    从您的查询中删除 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
    

    【讨论】:

      【解决方案3】:
      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多