Reputation: 3036
I am trying to limit the following SQL statement.
SELECT expense.*, transaction.* FROM expense
INNER JOIN transaction ON expense_id = transaction_expense_id
What I want to do, is limit the number of 'parent' rows. IE. if I do a LIMIT 1, I would receive only one expense item, but still get all transactions associated with it.
How would this be achieved? I am using MySQL 5.0
At this stage, if I do LIMIT 1, I get one expense, and only one transaction.
Upvotes: 32
Views: 58682
Reputation: 11
Even though this is old... came across this in a search and thought I'd add a couple thoughts, given the inability to use limit in a subquery...
select e.expense_id, transaction.*
from (select max(expense_id) from expense) e
inner join transaction t ON e.expense_id = t.transaction_expense_id
or if you want to have all columns from expense
and not just expense_id
you could nest subqueries.
select e.*, t.*
from (
select e1.*
from expense e1 inner join (select max(expense_id) from expense) e2
on e1.expense_id = e2.expense_id
) e inner join transaction t on e.expense_id = t.transaction_expense_id
Upvotes: 0
Reputation: 68588
So assuming we can exclude the user table, it could be rewritten as:
select * from expense, transaction where expense_id = transaction_expense_id
Now if you want to apply a limit, you could do it like this:
select * from expense, transaction where expense_id = transaction_expense_id and
expense_id in (select expense_id from expense limit 1)
Would that do what you wanted? Obviously you need to be cautious about what order your expense_ids are going to come back in, so you probably want to use ORDER BY whatever.
Edit: Given the MySQL limitation described in your comment below, maybe this will work:
select * from (select id from expense order by WHATEVER limit 1) as t1, transaction where expense_id=transaction_expense_id;
Ben
Upvotes: 20
Reputation: 3036
Since upgrading the SQL server is not an option, I may end up doing two queries.
expenses = SELECT * FROM expense ... LIMIT x
foreach expenses as expense
expense.transactions = SELECT * FROM transacion WHERE transaction_expense_id = expense.expense_id
Upvotes: 2
Reputation: 59346
You'll have to specify which expense item you want to get. The most expensive? The newest? Then join against a subquery that returns only that:
SELECT
expense.*, transaction.*, user.*
FROM
(SELECT * FROM expense WHERE ...) AS expense
INNER JOIN
transaction ON expense_id = transaction_expense_id
Upvotes: 11