2009-01-30 5 views
21

Ich versuche, die folgende SQL-Anweisung zu begrenzen.LIMITIEREN eines SQL JOIN

Was ich tun möchte, ist die Anzahl der 'Eltern' Zeilen zu begrenzen. IE. Wenn ich LIMIT 1 mache, würde ich nur einen Kostenposten erhalten, aber trotzdem alle damit verbundenen Transaktionen erhalten.

Wie würde dies erreicht werden?

In diesem Stadium, wenn ich LIMIT 1, bekomme ich eine Ausgabe und nur eine Transaktion.

+0

Ich könnte dumm sein, aber müssen Sie die Benutzertabelle nicht irgendwo in den Join einfügen? – Ben

+0

wie @rixth darauf hingewiesen, müssen Sie Ihre Joins zu allen Tabellen in der SELECT ... –

+0

Whoops qualifizieren, vergaß die Benutzer-Tabelle war da drin! Typo meinerseits, Quest wurde behoben. –

Antwort

11

So gehen wir davon aus, die Benutzertabelle ausschließen kann, könnte es umgeschrieben werden:

select * from expense, transaction where expense_id = transaction_expense_id 

Nun, wenn Sie eine Grenze anwenden möchten, können Sie es wie dies tun könnte:

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

Would das tun, was du wolltest? Natürlich müssen Sie vorsichtig sein, in welcher Reihenfolge Ihre Ausgaben-IDs zurückkommen werden, also möchten Sie wahrscheinlich ORDER BY verwenden.

Edit: In Anbetracht der MySQL Einschränkung unten in Ihrem Kommentar beschrieben, vielleicht wird diese Arbeit:

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

Ben

+0

"# 1235 - Diese Version von MySQL unterstützt noch nicht 'LIMIT & IN/ALL/ANY/SOME Unterabfrage'" Serverversion: 5.0.27-community-nt –

+1

Unterabfrage ist der richtige Weg mach das. Sie haben eine MySQL-Einschränkung erreicht. entweder upgraden (auf 5.1, was das Problem beheben könnte, oder auf Postgres). Andernfalls müssen Sie eine nicht-reine SQL-Lösung oder etwas wirklich Schreckliches in Betracht ziehen. – kquinn

+0

Markierung als akzeptierte Antwort, da sie in einer anderen SQL-Umgebung funktionieren würde. –

8

Sie werden angeben müssen, welche Kosten Artikel, den Sie erhalten möchten. Das teuerste? Das Neueste? Dann treten Sie gegen eine Unterabfrage, die nur das zurückgibt:

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

Was, wenn ich sagen wollte, 10 Ausgabenposten (mit zugehörigen Transaktionen) zurückgeben –

+0

@rixth: Dies verwendet so viele Ausgabenposten wie die Unterabfrage zurückgibt. –

+0

@Tom Ändern Sie es in 'WHERE ... LIMIT 10) AS Kosten'. Ich denke. – Timmmm

2

Da der SQL Server aktualisieren, ist keine Option, kann ich bis zu tun zwei Abfragen beenden.

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