连接子查询中的外部选择列值?

时间:2010-04-21 22:41:28

标签: mysql

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

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'。”

这是数据库转储。

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);

1 个答案:

答案 0 :(得分:15)

您的内部查询是一个相关的子查询,但它根本看不到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;