2010-04-21 13 views
5

¿Es posible usar un valor de columna desde una selección externa dentro de una subconsulta unida?¿Valor de columna de selección externa en subconsulta unida?

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; 

Esto da como resultado "Unknown column 'table1.lt' en 'where clause'".

Aquí está el volcado de 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); 

Respuesta

10

Su consulta interna es una subconsulta correlacionada, pero no puede ver la tabla1 en absoluto. Esta es una restricción en MySQL - vea MySQL Manual - D.3. Restrictions on Subqueries. A mitad de camino se afirma:

subconsultas en la cláusula FROM subconsultas no se pueden correlacionar. Están materializados (ejecutados para producir un conjunto de resultados ) antes de evaluar la consulta externa , por lo que no pueden ser evaluados por fila de la consulta externa.

Aunque la subconsulta es parte de una expresión LEFT JOIN, esto es parte de la cláusula FROM.

Esta reformulación podría hacer el trabajo para usted:

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