mysql / php:显示帖子和每个帖子的所有评论

时间:2012-04-20 22:28:27

标签: php mysql sql select

我知道这个问题已被多次询问(但是,我仍然找不到解决方案):

基本问题:拥有表格帖子评论用户 ...您可以使用一个选择语句选择并显示所有帖子和所有评论(使用comment.user,comment.text,comment.timestamp)?这样的选择语句怎么样?如果没有,最简单的解决方案是什么?

我还尝试使用JOIN表格comments posts表并使用GROUP BY,但我在每行或每条评论中只有一条评论,但也那些帖子多次了!?

我尝试了第一个链接的解决方案(嵌套的mysql_query然后获取)以及第二个链接(使用数组)。然而,第一个引起了一堆错误(该帖子中的语法似乎不正确,我无法弄清楚如何解决它),在第二个我遇到了数组问题。

我的查询到目前为止看起来像这样:

SELECT p.id, p.title, p.text, u.username, c.country_name, (SELECT SUM(vote_type) FROM votes v WHERE v.post_id = p.id) AS sum_vote_type FROM posts p LEFT JOIN user u ON ( p.user_id = u.id ) LEFT JOIN countries c ON ( c.country_id = u.country_id ) ORDER BY $orderby DESC

我想知道这个问题是不是很常见,有帖子和评论要显示......?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:8)

不知道你的数据库结构,它看起来应该是这样的。请注意,您应该将*字符替换为您实际需要的更明确的列列表。

SELECT p.*, c.*, u.* FROM posts p
LEFT JOIN comments c ON c.post_id = p.id
LEFT JOIN users u ON u.id = p.author_id

请注意,如果您只是想获得计数,总和等等,那么缓存部分信息是个好主意。例如,您可能希望在post表中缓存注释计数,而不是在每个查询中对它们进行计数。仅在添加/删除评论时计算和更新评论计数。

修改 意识到您还想将用户数据附加到每个评论。你可以不止一次地加入同一个表,但它变得很难看。这可能会变成一个非常昂贵的查询。我还提供了一个如何对列进行别名的示例,以免混淆:

SELECT p.*, c.*, u.name as post_author, u2.name as comment_author FROM posts p
LEFT JOIN comments c ON c.post_id = p.id
LEFT JOIN users u ON u.id = p.author_id
LEFT JOIN users u2 ON u2.id = c.author_id