2010-01-18 25 views
5

Tôi đang chạy một truy vấn đơn giản với một tham gia, tương tự nhưtruy vấn SQL với giới hạn trên các hàng từ một bảng, không phải là kết quả thiết

SELECT t1.a, t2.b FROM t1 LEFT JOIN t2 ON ... LIMIT 5 

Như t1 có-nhiều hàng trong t2 (bất kỳ số lượng trên 2) tuyên bố LIMIT không trả về 5 hàng đầu tiên từ t1 và các mục tương ứng từ t2, nhưng 5 hàng thường bao gồm 2-3 hàng từ t1.

Tôi làm cách nào để viết truy vấn này để nhận 5 hàng đầu tiên từ t1 và các mục tương ứng từ t2?


Sử dụng MySQL 5.0.45.

Trả lời

7
SELECT t3.a, t2.b FROM (SELECT * FROM t1 LIMIT 5) t3 
LEFT JOIN t2 ON ... 

Lưu ý rằng nếu bạn sử dụng giới hạn mà không có một thứ tự do 'khoản, nó không được định nghĩa trong đó 5 hàng bạn sẽ nhận được. Xem xét thêm mệnh đề 'order by' nếu đây không phải là điều bạn muốn.

+0

Xin lưu ý, giải pháp này có vấn đề về khả năng mở rộng với MySQL, cũng như không hoạt động nếu anh ấy muốn ORDER BY một trường trong t2. – hobodave

+0

@hobodave May mắn thay, tôi 'ORDER BY' một trường trong t1. –

+0

@Robert: Bạn có thể thấy rằng bạn cần phải áp dụng ORDER BY hai lần - một lần bên trong truy vấn bên trong để chọn năm hàng đầu tiên, và sau đó lại trong truy vấn bên ngoài để đảm bảo kết quả được trả về theo cùng thứ tự. –

0

Tôi tin rằng sau đây sẽ làm các trick:

SELECT t1.a, (SELECT t2.b FROM t2 WHERE t2... = t1...) AS b FROM t1 LIMIT 5 
+0

Cảm ơn câu trả lời. Vì có nhiều mục nhập trong t2 tương ứng với t1, tôi nhận được 'LRI 1242 (21000): Truy vấn con trả về nhiều hơn 1 hàng'. –

2

Đây là truy vấn phân trang cổ điển. Tôi khuyên bạn nên tách nó ra thành hai truy vấn:

SELECT DISTINCT t1.id FROM t1 LEFT JOIN t2 ON ... LIMIT 5 

Thực hiện các id và đặt chúng trong các truy vấn sau đây:

SELECT t1.a, t2.b FROM t1 LEFT JOIN t2 ON ... WHERE t1.id IN (?,?,?,?,?) 
+0

Cảm ơn câu trả lời. Một giải pháp truy vấn 1 là thích hợp hơn, và đã được cung cấp. –

+0

np, chỉ cần nhận thức được ý nghĩa hiệu suất của giải pháp bảng dẫn xuất cũng như SELECT *. – hobodave

+0

Đó cũng là một điểm tốt. Ngay bây giờ bảng dẫn xuất cần xem xét ~ 8k hàng, và nó đủ nhanh. Ngoài ra, tôi sẽ không sử dụng 'SELECT *'. –

0

Bạn có thể nhóm nó bằng cách cột duy nhất trong t1:

SELECT * FROM t1 JOIN t2 ON ... GROUP BY t1.id LIMIT 5 

Nhưng bạn có cần bảng t2 theo thứ tự cụ thể không?

+0

Cảm ơn câu trả lời. Hãy nhìn vào câu hỏi của tôi, tôi cần nhiều hơn 5 hàng trả lại, đó là 10+ hàng từ t2 cùng với _exactly_ 5 hàng từ t1. Câu trả lời được chấp nhận có một giải pháp tốt. hobodave cũng hoạt động. –

+0

ah có - có ý nghĩa, không đọc câu hỏi đúng cách. Câu trả lời được chấp nhận hoạt động tốt. Bạn cũng có thể làm điều đó với các biến đếm các hàng duy nhất nhưng điều đó trở nên lộn xộn. – TimoSolo

Các vấn đề liên quan