0

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

这是我的查询的一小部分不是全部,这个查询只是一部分并且ISN'T FINISH:

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  

......

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

语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法

4

2 回答 2

2

您可以通过使用子查询LIMIT在 a中使用:JOIN

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

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

于 2013-01-27T16:35:39.500 回答
1

如所写,您的示例已满或有错误。您的派生表没有SELECT子句,您引用了表和列引用,并且不清楚originsorigin_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

我选择使用两个表别名(ab)。我假设originsorigin_aliasesdiets是表格。请注意,您不应该使用SELECT *; 从每个派生表以及主子SELECT句中提供您想要的列名。

于 2013-01-27T18:40:45.220 回答