2010-04-21 42 views
5

是否可以在连接的子查询中使用外部选择中的列值?连接子查询中的外部选择列值?

SELECT table1.id, table2.cnt FROM table1 LEFT JOIN (SELECT COUNT(*) as `cnt` FROM table2 where table2.lt > table1.lt and table2.rt < table1.rt) as table2 ON 1; 

这会导致“where子句'中的未知列'table1.lt'。

这是db转储。

CREATE TABLE IF NOT EXISTS `table1` (`id` int(1) NOT NULL, `lt` int(1) NOT NULL, `rt` int(4) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

CREATE TABLE IF NOT EXISTS `table2` (`id` int(1) NOT NULL, `lt` int(1) NOT NULL, `rt` int(4) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `table1` (`id`, `lt`, `rt`) VALUES (1, 1, 4); 

INSERT INTO `table2` (`id`, `lt`, `rt`) VALUES (2, 2, 3); 

回答

10

您的内部查询是一个相关的子查询,但它根本无法看到table1。这是对MySQL的限制 - 请参阅MySQL Manual - D.3. Restrictions on Subqueries。大约一半的时候它指出:

FROM子句中的子查询不能 被关联的子查询。在评估 外部查询之前,它们是 实体化的(执行时产生一个 结果集),所以它们不能被 评估,每行对外部查询进行评估。

虽然子查询是LEFT JOIN表达式的一部分,但它是FROM子句的一部分。

这再形成可能会为你做的工作:

SELECT table1.id, 
     (SELECT COUNT(*) FROM table2 where table2.lt > table1.lt and table2.rt < table1.rt) as cnt 
FROM table1;