2009-01-30 17 views
21

Próbuję ograniczyć poniższą instrukcję SQL.OGRANICZENIE DOŁĄCZ DO SQL

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

Co chcę zrobić, to ograniczyć liczbę wierszy "nadrzędny". TO ZNACZY. jeśli wykonam LIMIT 1, otrzymam tylko jedną pozycję wydatku, ale nadal otrzymam wszystkie transakcje z nią związane.

Jak to osiągnąć?

Na tym etapie, jeśli wykonuję LIMIT 1, otrzymuję jeden wydatek i tylko jedną transakcję.

+0

Być może jestem głupi, ale czy nie musisz dołączać tabeli użytkownika w miejscu łączenia? – Ben

+0

jak zauważyła @rixth, musisz zakwalifikować swoje połączenia do wszystkich tabel związanych z SELECT ... –

+0

Oops, zapomniałem, że stół użytkownika był tam! Typo z mojej strony, quest został naprawiony. –

Odpowiedz

11

Więc zakładając, że możemy wykluczyć tabeli użytkownika, może być zapisane jako:

select * from expense, transaction where expense_id = transaction_expense_id 

Teraz, jeśli chcesz zastosować limit, można zrobić to tak:

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

Would które robią, co chcesz? Oczywiście musisz zachować ostrożność w kwestii tego, w jakiej kolejności twoje wydatek-wydatek ma wrócić, więc prawdopodobnie zechcesz użyć ZAMÓWIENIA przez cokolwiek.

Edit: Z uwagi na ograniczenie MySQL opisane w komentarzu poniżej, może to będzie działać:

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

Ben

+0

"# 1235 - Ta wersja MySQL nie obsługuje jeszcze" LIMIT i IN/ALL/ANY/SOME subquery "" Wersja serwera: 5.0.27-community-nt –

+1

Podzapytowanie jest właściwym sposobem Zrób to. Uderzyłeś ograniczenie MySQL; albo uaktualnienie (do 5.1, które może to naprawić, albo do PostgreSzu). W przeciwnym razie będziesz musiał rozważyć nie-czyste rozwiązanie SQL lub coś naprawdę ohydnego. – kquinn

+0

Oznaczanie jako zaakceptowanej odpowiedzi, ponieważ działałoby w innym środowisku SQL. –

8

Musisz określić, które wydatek element, który chcesz uzyskać. Najdroższy? Najnowszy? Następnie dołącz do podzapytania, który zwraca tylko to:

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

Co jeśli chciałbym powiedzieć, zwróć 10 pozycji kosztowych (z powiązanymi transakcjami) –

+0

@rixth: to używa tylu pozycji wydatków, co spowoduje powrót podkwerendy. –

+0

@Tom Zmień to na "GDZIE ... LIMIT 10) AS wydatek". Myślę. – Timmmm

2

Od aktualizacji serwera SQL nie ma opcji, może skończyć się wykonywanie dwóch kwerend.

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