我正在尝试使用一些过滤器创建一个简单的搜索系统,其中一个过滤器是按“受欢迎程度”排序,这基本上会将评论最多的帖子放在最前面的帖子中。 我有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
从查询中它只显示该帖子一次。
如果有人能告诉我这里我做错了什么,因为我真的没有看到它。
答案 0 :(得分:1)
以下是一些观察结果:
JOIN
语法。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