2009-01-30 48 views
21

Tôi đang cố giới hạn câu lệnh SQL sau đây.Giới hạn một câu lệnh SQL JOIN

SELECT expense.*, transaction.* FROM expense 
INNER JOIN transaction ON expense_id = transaction_expense_id 

Điều tôi muốn làm là giới hạn số lượng hàng 'cha'. I E. nếu tôi thực hiện LIMIT 1, tôi sẽ chỉ nhận được một khoản chi phí, nhưng vẫn nhận được tất cả các giao dịch liên kết với nó.

Làm cách nào để đạt được điều này?

Ở giai đoạn này, nếu tôi làm LIMIT 1, tôi sẽ nhận được một chi phí và chỉ một giao dịch.

+0

Tôi có thể đang câm, nhưng bạn không cần đưa bảng người dùng vào tham gia ở đâu đó? – Ben

+0

như @rixth chỉ ra, bạn cần phải đủ điều kiện tham gia của bạn để tất cả các bảng tham gia vào các SELECT ... –

+0

Rất tiếc, quên bảng người dùng đã ở đó! Typo về phía tôi, nhiệm vụ đã được sửa. –

Trả lời

11

Vì vậy, giả sử chúng ta có thể loại trừ các bảng sử dụng, nó có thể được viết lại như sau:

select * from expense, transaction where expense_id = transaction_expense_id 

Bây giờ nếu bạn muốn áp dụng một giới hạn, bạn có thể làm điều đó như thế này:

select * from expense, transaction where expense_id = transaction_expense_id and 
    expense_id in (select expense_id from expense limit 1) 

Would làm những gì bạn muốn? Rõ ràng bạn cần phải thận trọng về thứ tự mà cost_ids của bạn sẽ quay trở lại, vì vậy bạn có thể muốn sử dụng ORDER BY bất cứ điều gì.

Edit: Căn cứ vào giới hạn MySQL được mô tả trong bình luận của bạn dưới đây, có lẽ điều này sẽ làm việc:

select * from (select id from expense order by WHATEVER limit 1) as t1, transaction where expense_id=transaction_expense_id; 

Bến

+0

"# 1235 - Phiên bản MySQL này chưa hỗ trợ 'LIMIT & IN/ALL/ANY/SOME subquery'" Phiên bản máy chủ: 5.0.27-community-nt –

+1

Truy vấn con là đúng cách để làm cái này. Bạn đã đạt đến giới hạn MySQL; hoặc nâng cấp (lên 5.1, có thể sửa lỗi này hoặc Postgres). Nếu không, bạn sẽ phải xem xét một giải pháp SQL không thuần túy hoặc một cái gì đó thực sự ghê tởm. – kquinn

+0

Đánh dấu là câu trả lời được chấp nhận vì nó sẽ hoạt động trong môi trường SQL khác. –

8

Bạn sẽ phải xác định các chi phí mục mà bạn muốn để có được. Đắt nhất? Mới nhất? Sau đó, tham gia vào một truy vấn phụ chỉ trả lại rằng:

SELECT 
    expense.*, transaction.*, user.* 
FROM 
    (SELECT * FROM expense WHERE ...) AS expense 
INNER JOIN 
    transaction ON expense_id = transaction_expense_id 
+1

Nếu tôi muốn nói, trả lại 10 khoản chi phí (với các giao dịch liên kết) –

+0

@rixth: điều này sử dụng nhiều mục chi phí vì truy vấn phụ sẽ trả về. –

+0

@Tom Thay đổi thành 'WHERE ... LIMIT 10) AS cost'. Tôi nghĩ. – Timmmm

2

Kể từ khi nâng cấp máy chủ SQL không phải là một tùy chọn, tôi có thể thực hiện hai truy vấn.

expenses = SELECT * FROM expense ... LIMIT x 
foreach expenses as expense 
    expense.transactions = SELECT * FROM transacion WHERE transaction_expense_id = expense.expense_id 
Các vấn đề liên quan