复杂的嵌套SQL查询

时间:2018-02-18 21:07:42

标签: sql

更新我会调试我的问题,并通过更详细的说明重新发布!我为这种困惑道歉!

更新评论或发布回复的所有人都会将您链接到我的重新发布内容,感谢您抽出宝贵时间查看我的问题并发表评论/回答!

我会简单直截了当地提出我的问题;当我包含前三个子查询时,下面的代码块会生成语法错误。

我做错了什么?

SELECT 
      parent1.parent1_id,
      parent1.child1_id,
      parent1.child2_id,
      parent1.child3_id,
      parent2.parent2_id,
      parent2.child1_id,
      parent2.child2_id,
      parent2.child3_id
   FROM 
      parent1
         LEFT JOIN 
         ( SELECT 
                 child1.child1_id, 
                 child1.child1_content
              FROM 
                 child1 
              WHERE 
                 child1.child1_id = parent1.child1_id ) child1
         ( SELECT 
                 child1_extras.child1_extrasID, 
                 child1_extras.child1_extrasContent
              FROM 
                 child1_extras
              WHERE 
                 child1_extras.child1_id = child1.child1_id )
            ON parent1.child1_id = child1.child1_id
         LEFT JOIN child2
         ( SELECT 
                 child2.child2_id, 
                 child2.child2_content
              FROM 
                 child2 
              WHERE
                 child2.child2_id = parent1.child2_id )
         ( SELECT 
                 child2_extras.child2_extrasID, 
                 child2_extras.child2_extrasContent
              FROM 
                 child2_extras
              WHERE 
                 child2_extras.child2_id = child2.child2_id )
            ON parent1.child2_id = child2.child2_id
         LEFT JOIN child3
         ( SELECT 
                 child3.child3_id, 
                 child3.child3_content
              FROM 
                 child3
              WHERE 
                 child3.child3_id = parent1.child3_id )
         ( SELECT 
                 child3_extras.child3_extrasID, 
                 child3_extras.child3_extrasContent 
              FROM 
                 ( SELECT 
                         comments.comment_id, 
                         comments.comment
                      FROM 
                         comments 
                      WHERE 
                         comments.child3_extrasID = child3_extras.child3_extrasID ) child3_extras
           JOIN child3 
              ON child3_extras.child3_id = child3.child3_id )

              ON parent1.child3_id = child3.child3_id
           LEFT JOIN followers
              ON parent1.user_id = followers.followed_id
              AND parent1.parent1_timestamp > followers.follower_timestamp
              AND parent1.parent1_id NOT IN ( SELECT removed.isub_rmv FROM removed )
              AND parent1.parent1_hide = false
   WHERE 
      followers.follower_id = {$_SESSION['info']}
      {$portname_clause}
   ORDER BY 
      parent1.parent1_timestamp DESC
      LIMIT {$postnumbers} 
   OFFSET 
      {$offset}

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

问题在于你的语法。我重新格式化了你的查询,但并不确切知道什么是什么。正如评论中所述,单独简化查询以查明它们是否有效,然后添加到链中的下一个。

澄清的最大例子是加入其他表格。每次加入时,都会执行查询并为其指定别名参考。别名是查询其余部分的基础。不要将别名WIHTIN和子选择混淆到外部查询。如果不进行确切的查询,请查看以下内容

SELECT 
      parent1.parent1_id, etc, etc, etc
   FROM 
      parent1
         LEFT JOIN 
         ( SELECT 
                 child1.child1_id, 
                 child1.child1_content
              FROM 
                 child1 
              WHERE 
                 child1.child1_id = parent1.child1_id ) CHILD1

小写" child1" INNER查询与OUTER大写不一样" CHILD1"如上所示。我想你想要得到的更多是以下内容。另请注意,我正在应用ALIASES来帮助确认ACTUAL表名与可能的子查询条件之间的区别。

SELECT 
      P1.parent1_id, 
      C1.child1_content,
      C1X.child1_extrasID, 
      C1X.child1_extrasContent
   FROM 
      parent1 P1
         LEFT JOIN child1 C1
            on P1.child1_id = C1.child1_id
         LEFT JOIN child1_extras C1X
            on P1.child1_id = C1X.child1_id

请注意,每个附加表都是从之前的可能表中加入的。我也试着让我左边的表(在查询中的第一个)加入或左连接到第二个别名结果密钥ID。

尝试使用一些固定标准的上述简化示例查询,看它是否有效。然后应用你的额外表连接,其中,顺序,偏移等。