2009-01-30 79 views
21

我想限制下面的SQL語句。限制SQL JOIN

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

我想要做的是限制'父'行的數量。 IE瀏覽器。如果我做了限制1,我只會收到一個支出項目,但仍然可以獲得與其相關的所有交易。

這將如何實現?

在這個階段,如果我做了LIMIT 1,我會得到一筆開支,而且只有一筆交易。

+0

我可能是愚蠢的,但是你不需要在某處加入用戶表嗎?作爲@rixth指出的 – Ben 2009-01-30 09:42:13

+0

,您需要限定您所參與的所有表的連接... – 2009-01-30 09:43:59

+0

哎呀,忘記了用戶表在那裏!我的錯字,任務已經修復。 – 2009-01-30 09:45:00

回答

11

因此,假如我們可以排除用戶表,它可以被改寫爲:

select * from expense, transaction where expense_id = transaction_expense_id 

現在,如果你想申請的限制,你可以做這樣的:

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

會那做你想做的事?很明顯,你需要對你的expense_ids將返回的順序保持謹慎,所以你可能想要使用ORDER BY。

編輯:鑑於在下面的評論中描述的MySQL的限制,也許這將工作:

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

8

你必須指定你想獲得其費用項目。最昂貴的?最新的?然後加入一個僅返回該子查詢的子查詢:

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

由於升級SQL服務器不是一個選項,我可能最終會做兩個查詢。

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