一对多,在一个查询中选择一个和多个

时间:2014-07-21 17:20:21

标签: mysql sql join left-join

我有四张桌子

POST - USER --IMAGE-- COMMENT

我想要检索有关所有帖子,发布它们的用户,与之关联的图像(每个帖子只有一个图像)和与每个给定帖子相关联的(列表/数组)注释的信息。

这就是我所拥有的:

SELECT * 
FROM post 
LEFT JOIN image 
    ON post.image_id=image.id 
LEFT JOIN user 
    ON user.id=post.user_id 
LEFT JOIN comment 
    ON comment.post_id =post.id

这几乎有效,除了每个帖子记录都是针对其中的每个评论重复的。如何获得包含所有评论的一条记录?

2 个答案:

答案 0 :(得分:3)

除了*运算符效率非常低之外,您只能在一个查询中执行"一个帖子"< =>"很多评论&#34 ;。每个条目都会合并帖子及其评论。

您可以使用GROUP_CONCAT之类的技巧来创建"评论行"。但这真的很奇怪。

Group_Concat

的示例
SELECT p.*, 
   GROUP_CONCAT(image.url SEPARATOR "~") AS image_url, GROUP_CONCAT(comment.text SEPARATOR "#~#") AS comment_text
   FROM post p 
LEFT JOIN image 
    ON p.image_id=image.id 
LEFT JOIN user 
    ON user.id=p.user_id 
LEFT JOIN comment 
   ON comment.post_id =p.id

每个帖子会给你一行,每个评论由#34;#〜#"相互粘合。不太酷。

我认为你必须让它像SQL自然处理它一样。

答案 1 :(得分:0)

这似乎是多个查询的工作。您可以选择图像,然后为每个图像选择注释,或者您可以选择图像,然后选择所有注释并在代码中根据需要对它们进行分组。它们之间的选择取决于您如何使用它。但是,如果您想要遵守关系数据库设计模式,则需要将其作为多个查询来执行。你不能像你正在寻找的那样返回一个数组。