2014-07-21 124 views
3

我有四个表一对多,在一个查询中选择一个和许多

POST - 用户 - 图片 - 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

你会想要使用Group_concat,但很难给你一个例子,而不知道字段名称 –

+3

只是重复的生活。他们很好。 – Strawberry

+0

只是为了澄清......你现在有一个select语句,它在返回一个帖子的几条评论,而不是让每条帖子/评论都是它自己的一行,你宁愿将它作为一条帖子然后一系列评论?如果是这样......为什么? – Twelfth

回答

3

除了*运算符真的效率低下以外,你只能在一个查询“one post”< =>“many comment”中做不到。每个条目都会合并该帖子及其评论。

您可以使用一个技巧,如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 

它会给你平均每个职位每个注释一行粘一个到另一个由“#〜#”。不那么酷。

我认为你只需让它像SQL一样自然处理。

0

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