许多连接中的SQL限制

时间:2013-01-27 16:31:04

标签: mysql sql join left-join

我的网站上的页面中有很多内部联接的大查询。 我想申请一些左外连接限制1,但如果我把它放入sql给我错误。

这是我的查询的一小部分不是完全的,这个查询只是一部分而且不是完成:

SELECT * FROM products 
               LEFT OUTER JOIN  (origins 
                        LEFT OUTER JOIN  origin_aliases ON origin_aliases.origin_id = origins.id 
                        AND origin_aliases.language = '$lang'
                        LEFT OUTER JOIN  (diets LEFT OUTER JOIN  diet_aliases ON diet_aliases.diet_id = diets.id AND diet_aliases.language = '$lang') 
                        ON origins.diet_id = diets.id) 
                ON products.origin_id = origins.id
                LEFT OUTER JOIN  (product_aliases 
                        LEFT OUTER JOIN  (users as users1
                            LEFT OUTER JOIN  profiles as profiles1 ON profiles1.user_id = users1.id
                            LEFT OUTER JOIN  user_options as user_options1 ON user_options1.user_id = users1.id 
                            LEFT OUTER JOIN  avatars as avatars1 ON avatars1.user_id = users1.id
                        ) 
                        ON  product_aliases.user_id =users1.id
                        LEFT OUTER JOIN  (users as users2
                            LEFT OUTER JOIN  profiles as profiles2 ON profiles2.user_id = users2.id
                            LEFT OUTER JOIN  user_options as user_options2 ON user_options2.user_id = users2.id
                            LEFT OUTER JOIN  avatars as avatars2 ON avatars2.user_id = users2.id 
                        )  
                        ON  product_aliases.edit_user_id = users2.id)
                ON product_aliases.product_id = products.id  

.....

例如,我想在ON 'products.origin_id'='origins.id'成为可能之后在源外左连接中应用限制1吗?我怎样才能做到这一点? 我试图在条件限制1之后放置但是给我一个错误

  

语法错误或访问冲突:1064 SQL中有错误   句法;查看与MySQL服务器版本对应的手册   正确的语法

2 个答案:

答案 0 :(得分:2)

您可以使用子查询在LIMIT中使用JOIN

... LEFT JOIN (SELECT column1, column2 FROM table LIMIT 2) ON ...

此外,如评论中所述,请勿在包含表格的列名称周围使用单引号。

答案 1 :(得分:1)

如上所述,您的示例已满或有错误。您的派生表没有SELECT个子句,您引用了表格和列引用,并且不清楚 origin origin_aliases 等名称是表格还是别名。那些是你的语法错误。

更正后,可以将LIMIT表达式添加到整个查询或任何派生表中。这是我最好的猜测:

SELECT * 
FROM products 
LEFT OUTER JOIN ( 
   select *
   from   origins 
   LEFT OUTER JOIN origin_aliases 
   ON     origin_aliases.origin_id = origins.id 
      AND origin_aliases.language = '$lang' 
   LEFT OUTER JOIN ( 
      select *
      from   diets 
      LEFT OUTER JOIN  diet_aliases 
      ON     diet_aliases.diet_id = diets.id 
         AND diet_aliases.language = '$lang'
      ) d
   ON origins.diet_id=d.id

   LIMIT 1
   ) a
ON products.origin_id=a.id

我选择使用两个表别名( a b )。我假设起源 origin_aliases 饮食是表格。请注意,您不应该使用SELECT *;从每个派生表以及主SELECT子句中提供所需的列名。