【问题标题】:One to Many, select one and many in one query一对多,多选一查询
【发布时间】:2014-09-12 07:19:00
【问题描述】:

我有四张桌子

发布--用户--图片--评论

我想检索有关所有帖子、发布帖子的用户、与其关联的图像(每个帖子只有一个图像)以及与每个给定帖子关联的(列表/数组)cmets 的信息。

这就是我所拥有的:

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

这几乎是可行的,除了每个帖子记录对于它的许多 cmets 中的每一个都重复。如何获得包含所有 cmets 的记录?

【问题讨论】:

  • 您会想使用 Group_concat,但在不知道字段名称的情况下很难举个例子
  • 忍受重复。他们很好。
  • 只是为了澄清......您目前有一个 select 语句,它为一个帖子返回几个 cmets,而不是让每个帖子/评论都是它自己的行,您更愿意拥有这个作为一条线,然后是一组cmets?如果是这样……为什么?
  • 这比你想象的还要糟糕。将针对相关图像、用户和评论的每个不同组合重复此操作。

标签: mysql sql join left-join


【解决方案1】:

除了* 操作符确实效率低下,你不能只在一个查询中做到“一篇文章”“多条评论”。每个条目都会合并帖子及其评论。

您可以使用诸如GROUP_CONCAT 之类的技巧来创建“cmets 行”。但这会很奇怪。

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 一样自然地处理它。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2013-06-11
      • 2018-01-26
      相关资源
      最近更新 更多