小编典典

mysql / php:显示帖子,并为每个帖子提供所有注释

sql

基本问题:拥有表 postscommentsuser
…可以用一个选择语句选择并显示所有帖子和所有注释(带有comment.user,comment.text,comment.timestamp)吗?这样的选择语句会是什么样子?如果没有,最简单的解决方案是什么?

我也尝试JOINcomments表与table一起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

我想知道是否这个问题不是很普遍,有帖子和评论来显示…?

谢谢您提前提供的所有帮助!


阅读 332

收藏
2021-03-23

共1个答案

小编典典

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

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

请注意,如果您只是想获取计数,总和之类的东西,则最好缓存其中的一些信息。例如,您可能希望将评论计数缓存在发布表中,而不是对每个查询都进行计数。仅在添加/删除评论时计算和更新评论数。

编辑:
意识到您还希望将用户数据附加到每个注释。您可以多次加入同一张表,但是它很难看。这可能会变成一个非常昂贵的查询。我还提供了一个有关如何为列添加别名的示例,以减少混乱:

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
2021-03-23