2012-07-18 71 views
0

我有模型用户,发布,评论和标签。如何从MySQL中选择与连接嵌套数组

  • 用户创建帖子。
  • 帖子可以有多个Comment和Tag。

每个模型都有它自己的表格,所以有表格'posts','comments'和'tags'。注释有一个名为'post_id'的外键,而标签有一个名为'post_tags'的many_to_many关系表,其中有两个字段:'post_id'和'tag_id'。

我希望得到一个嵌套的数组象下面这样:

  • MySQL的查询我应该运行哪一个?
  • 我想我需要改变结果与PHP来得到我的嵌套数组。怎么样?

非常感谢您的帮助:-)

[0] => Array 
    (
     [Post] => Array 
      (
       [id] => 1 
       [title] => First article 
       [content] => aaa 
       [created] => 2008-05-18 00:00:00 
      ) 
     [Comment] => Array 
      (
       [0] => Array 
        (
         [id] => 1 
         [post_id] => 1 
         [author] => Daniel 
         [email] => [email protected] 
         [website] => http://example.com 
         [comment] => First comment 
         [created] => 2008-05-18 00:00:00 
        ) 
       [1] => Array 
        (
         [id] => 2 
         [post_id] => 1 
         [author] => Sam 
         [email] => [email protected] 
         [website] => http://example.net 
         [comment] => Second comment 
         [created] => 2008-05-18 00:00:00 
        ) 
      ) 
     [Tag] => Array 
      (
       [0] => Array 
        (
         [id] => 1 
         [name] => Awesome 
        ) 
       [1] => Array 
        (
         [id] => 2 
         [name] => Baking 
        ) 
      ) 
    ) 
    [1] => Array 
    (
     [Post] => Array 
      (... 
+1

第一件事同样的数据多次发送更为有效:你为什么要一个查询? – RobIII 2012-07-18 22:07:48

+1

我们不能给你一个没有数据库模式的SQL查询,所以我们可以看到数据来自哪里。如果可能的话,这将是非常困难的,并且将涉及服务器端的结果数据的一些解码,这可能(可能将)比运行多个查询在计算上更昂贵。 – DaveRandom 2012-07-18 22:08:05

+0

我已更新该问题以反映您的反馈。此外,不要求仅使用单个MySQL查询。我只是认为那是最好的。任何解决方案与多个查询是受欢迎的 – preyz 2012-07-19 08:18:19

回答

2

你做3个查询的更好。

  1. 首次提取后(和左连接用户如果需要的话),并存储它们喜欢:

    $list[$row['post_id']]['Post'] = $row; 
    
  2. 然后获取所有后的意见,并将其保存为

    $list[$row['post_id']]['Comment'][$row['comment_id']] = $row; 
    
  3. 然后获取所有后的标签

    $list[$row['post_id']]['Tags'][$row['tag_id']] = $row; 
    

,远远高于试图用一个单一的查询, 作为一个单一的查询要结束了第一

+0

它可以使用单个查询吗? – 2017-06-14 05:45:13

+0

@RenishKhunt,你从数据库中得到了很多dublicate内容,并且必须在php中处理它,这是慢的,并且是一个无用的混乱。 – 2017-06-14 11:46:06