次のSQLステートメントを制限しようとしています。
SELECT expense.*, transaction.* FROM expense
INNER JOIN transaction ON expense_id = transaction_expense_id
私がやりたいのは、「親」行の数を制限することです。 IE。 LIMIT 1を実行すると、経費項目を1つだけ受け取りますが、それに関連するすべてのトランザクションを取得します。
これはどのように達成されますか?
この段階で、LIMIT 1を実行すると、費用は1つ、トランザクションは1つだけになります。
したがって、ユーザーテーブルを除外できると仮定すると、次のように書き直すことができます。
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がどの順序で返されるかについて注意する必要があるため、おそらくORDERBYを使用する必要があります。
編集:以下のコメントで説明されているMySQLの制限を考えると、おそらくこれは機能します:
select * from (select id from expense order by WHATEVER limit 1) as t1, transaction where expense_id=transaction_expense_id;
ベン
取得したいexpenseアイテムを指定する必要があります。最も高価な?最新の?次に、それだけを返すサブクエリに対して結合します。
SELECT
expense.*, transaction.*, user.*
FROM
(SELECT * FROM expense WHERE ...) AS expense
INNER JOIN
transaction ON expense_id = transaction_expense_id
SQLサーバーのアップグレードはオプションではないため、2つのクエリを実行することになります。
expenses = SELECT * FROM expense ... LIMIT x
foreach expenses as expense
expense.transactions = SELECT * FROM transacion WHERE transaction_expense_id = expense.expense_id
これは古いものですが...検索でこれに遭遇し、サブクエリで制限を使用できないことを考慮して、いくつかの考えを追加すると思いました...
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
または、expense_id
だけでなくexpense
のすべての列を取得する場合は、サブクエリをネストできます。
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