2010-04-21 34 views
5

Có thể sử dụng giá trị cột từ một lựa chọn bên ngoài trong một truy vấn phụ đã tham gia không?Giá trị cột lựa chọn bên ngoài trong truy vấn phụ đã tham gia?

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; 

Kết quả này trong "Cột không xác định" table1.lt 'in' where clause '".

Đây là kết xuất 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); 

Trả lời

10

Truy vấn bên trong của bạn là truy vấn con tương quan, nhưng không thể thấy bảng 1. Đây là một hạn chế đối với MySQL - xem MySQL Manual - D.3. Restrictions on Subqueries. Khoảng một nửa giảm xuống trạng thái:

Truy vấn phụ trong mệnh đề FROM không thể là các truy vấn con tương quan. Chúng là được thực hiện (được thực hiện để tạo ra tập hợp kết quả ) trước khi đánh giá truy vấn bên ngoài , vì vậy chúng không thể là được đánh giá mỗi hàng của truy vấn bên ngoài.

Mặc dù truy vấn phụ là một phần của biểu thức LEFT JOIN, đây là một phần của mệnh đề FROM.

Cải cách này có thể thực hiện công việc cho bạn:

SELECT table1.id, 
     (SELECT COUNT(*) FROM table2 where table2.lt > table1.lt and table2.rt < table1.rt) as cnt 
FROM table1; 
Các vấn đề liên quan