2010-06-10 79 views
0

是否允许从嵌套选择引用外部字段?MYSQL连接 - 从嵌套选择引用外部字段?

E.g.

SELECT 
FROM ext1 
LEFT JOIN (SELECT * FROM int2 WHERE int2.id = ext1.some_id) as x ON 1=1 

在这种情况下,这是在嵌套select中引用ext1.some_id。 在这种情况下,我收到错误字段ext1.some_id是未知的。 这可能吗?有没有其他的方法?

UPDATE:

不幸的是,我不得不使用嵌套的选择,因为我要添加更多条件吧,比如限制0,1 ,然后我需要使用一个在同一个表第二个连接与LIMIT 1,1(加入另一行) 最终的目标是从同一个表中连接2行,就好像这些是两个表 所以我很想将一些相关行“传播”到一个长行中。

回答

2

回答你最初的问题是:没有,删除您的子查询,并把情况向ON -clause:

SELECT * 
FROM ext1 
LEFT JOIN int2 ON (int2.id = ext1.some_id) 

一种解决方案可能是使用变量来找到第一(或第二)行,但这种解决方案不能有效地处理索引,所以你最终可能会遇到性能问题。

SELECT ext1.some_id, int2x.order_col, int2x.something_else 
FROM ext1 
LEFT JOIN (SELECT `int2`.*, @i:=IF(@id=(@id:=id), @i+1, 0) As rank 
      FROM `int2`, 
      (SELECT @i:=0, @id:=-1) v 
       ORDER BY id, order_col) AS int2x ON ( int2x.id = ext1.some_id 
                  AND int2x.rank = 0) 
; 

这是假设你有你想要(order_col)命令和左每some_id加入第一行一列。

+0

不幸的是,我不得不使用嵌套的选择,因为我要添加更多条件吧,比如限制0,1 然后我需要在LIMIT 1,1 的同一张表上使用第二次连接。最终目标是从同一个表中连接2行,就好像这些表是两个表一样 – AlexA 2010-06-10 09:46:02

0

你的意思是?

SELECT ... 
FROM ext1 
LEFT JOIN int2 ON int2.id=ext1.some_id 
0

这就是ON条款是什么:

SELECT 
FROM ext1 
LEFT JOIN int2 AS x ON x.id = ext1.some_id