5

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

基本问题:有表postscommentsuser ...你能用一个 select 语句选择并显示所有帖子和所有评论(使用 comment.user、comment.text、comment.timestamp)吗?这样的 select 语句会是什么样子?如果没有,最简单的解决方案是什么?

我也尝试JOIN使用commentstableposts并使用 table 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

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

提前感谢您的每一个帮助!

4

1 回答 1

10

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

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
于 2012-04-20T22:37:27.177 回答