2009-01-30 31 views
21

'U SINIRLAMA Aşağıdaki SQL deyimini sınırlamaya çalışıyorum.Bir SQL JOIN

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

Yapmak istediğim, "üst" satır sayısını sınırlamaktır. IE. Eğer bir LIMIT 1 yaparsam, sadece bir gider kalemi alırdım, ama yine de onunla ilişkili tüm işlemleri alırım.

Bu nasıl elde edilir?

Bu aşamada, LIMIT 1 yaparsam, tek bir gider ve yalnızca bir işlem alırım.

+0

Dilsiz olabilirim, ancak kullanıcı tablosunu bir yere katılmanıza gerek yok mu? – Ben

+0

@rixth'in işaret ettiği gibi, katılımlarınızı SELECT ... –

+0

'de yer alan tüm tablolara uygun hale getirmeniz gerekiyor. Whoops, kullanıcı masasının orada olduğunu unuttun! Benim üzerimde yazım hatası düzeltildi. –

cevap

11

yüzden kullanıcı tablosunu hariç tutabilir varsayarak, bu şekilde tekrar yazılabilir: Artık bir limit uygulamak istiyorsanız

select * from expense, transaction where expense_id = transaction_expense_id 

, bunu şöyle yapabilirsiniz:

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

misiniz istediğini yaptığın bu mu? Açıkçası, expense_ids'inizin hangi sırayla geri geleceği konusunda ihtiyatlı olmanız gerekiyor, bu yüzden muhtemelen SİPARİŞ BY'yi kullanmak isteyebilirsiniz.

Düzenleme: Aşağıdaki yorumunuzda açıklanan MySQL sınırlama dikkate alındığında, belki bu çalışacaktır:

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

Ben

+0

"# 1235 - MySQL'in bu sürümü henüz desteklenmiyor 'LİMİT & IN/ALL/ANY/BAZI alt sorgusu' 'Sunucu sürümü: 5.0.27-community-nt –

+1

Subquery, Doğru Yol Bunu yap. Bir MySQL sınırlamasına çarptınız; yükseltme (bunu düzeltebilecek 5.1'e veya Postgres'e). Aksi halde, saf olmayan bir SQL çözümü veya gerçekten iğrenç bir şey düşünmelisiniz. – kquinn

+0

Başka bir SQL ortamında çalışacağından kabul edilen yanıt olarak işaretle. –

8

Sen öğe almak istediğiniz gideri belirtmek gerekir. En pahalı? En yeni? Sonra sadece o döndüren bir alt sorgu karşı katılmak: SQL sunucusu yükseltme bir seçenek değildir

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

Söylemek istediğimde, 10 masraflı öğe (ilişkili işlemlerle) döndürün –

+0

@ rinth: Bu, alt sorgunun geri döneceği kadar fazla harcama öğesi kullanır. –

+0

@Tom 'WHERE ... LIMIT 10' olarak değiştirin. Bence. – Timmmm

2

beri, iki sorgu yapmak zorunda kalabilirler.

expenses = SELECT * FROM expense ... LIMIT x 
foreach expenses as expense 
    expense.transactions = SELECT * FROM transacion WHERE transaction_expense_id = expense.expense_id