检索来自MySQL表格的帖子的前几个评论
问题描述:
你知道Facebook主页如何列出所有最近的帖子?它显示发布的用户,他们的实际发布内容以及该帖子附带的前几个评论。这就是我想要实现的目标,但是我很难建立一个可以收集所有数据的单个查询。检索来自MySQL表格的帖子的前几个评论
我有3个表:用途,帖子和评论。每个人都有一个唯一的ID,但他们引用了彼此的ID。即,注释表具有用于发布的用户的user_id和其附加的帖子的post_id的列。
当时我查询SQL来收集所有帖子。我和我的用户和评论表,了解海报的用户名和一个总的职位有多少评论了,就像这样:
$query = "
SELECT `posts`.`id`,`posts`.`message`,`posts`.`link`,
`posts`.`posted`,`posts`.`category`,`posts`.`user_id`,
`users`.`username`,
count(`comments`.`id`)
FROM `posts`
INNER JOIN `users`
ON `posts`.`user_id`=`users`.`id`
JOIN `comments`
ON `comments`.`post_id`=`posts`.`id`
WHERE `posts`.`group_id` = '$id'
AND `posts`.`category`='$filter'
GROUP BY `posts`.`id`
ORDER BY `posts`.`posted`
DESC
";
但不是找到多少评论的帖子有,我反而喜欢阅读前几个帖子。任何人都可以想出一种方法来实现这一点只有一个查询?
答
您可以将LIMIT
子句用于“第一个”帖子。通过将“第一篇文章”作为子查询,然后加入评论,您可以在单个查询中获得所有内容。在没有评论的帖子的情况下,评论应该是加入的。
注:
这个查询是未经测试,但它应该是接近。
这将得到全部对于前几个帖子的评论,所以你需要使用前端显示代码来限制“每篇帖子最多3条评论”的显示。
在查询中使用变量在每个帖子内限制注释可能是3个,但这不是我知道该怎么做的。
这里的查询:
SELECT
FirstPosts.id,
FirstPosts.message,
FirstPosts.link,
FirstPosts.posted,
FirstPosts.posts,
FirstPosts.user_id,
FirstPosts.username,
comments.<< your comment column >>
FROM (
SELECT `posts`.`id`,`posts`.`message`,`posts`.`link`,
`posts`.`posted`,`posts`.`category`,`posts`.`user_id`,
`users`.`username`
FROM `posts`
INNER JOIN `users`
ON `posts`.`user_id`=`users`.`id`
WHERE `posts`.`group_id` = '$id'
AND `posts`.`category`='$filter'
ORDER BY `posts`.`posted` DESC
LIMIT 20) FirstPosts
LEFT JOIN comments ON FirstPosts.id = comments.post_id
ORDER BY FirstPosts.Posted, comments.<< column you use to determing comment order >>
如果您按日期或序列确定评论顺序,你必须ORDER BY FirstPosts.Posted, comments.whatever DESC
。
希望这会有所帮助!
感谢您的回复。我实际上使用mysqli。另外,我的问题不是如何限制我的结果,而是如何得到结果。如果在我的页面上会显示20个帖子,我不想运行20个查询来返回评论,我想获取所有帖子数据和这个查询中的前3个评论。我想这意味着如果MySQL能够做到这一点,MySQL会返回一个INSIDE数组。 – user1537360 2013-05-06 15:26:10
对不起,我误解了这个。我会更新我的答案,但请注意:(a)查询未经测试;(b)前20条帖子将获得*全部*评论,因此您必须使用前面 - 结束PHP代码。 – 2013-05-06 15:34:22
哈哈得承认,这打破了我的头脑一段时间(我对MySQL很新颖)。想想我的头脑,但是做了一些调整,并做到了这一点。谢谢! – user1537360 2013-05-06 16:09:10