我有四张桌子
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
这几乎有效,除了每个帖子记录都是针对其中的每个评论重复的。如何获得包含所有评论的一条记录?
答案 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)
这似乎是多个查询的工作。您可以选择图像,然后为每个图像选择注释,或者您可以选择图像,然后选择所有注释并在代码中根据需要对它们进行分组。它们之间的选择取决于您如何使用它。但是,如果您想要遵守关系数据库设计模式,则需要将其作为多个查询来执行。你不能像你正在寻找的那样返回一个数组。