web-dev-qa-db-ja.com

SQL結合の制限

次のSQLステートメントを制限しようとしています。

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

私がやりたいのは、「親」行の数を制限することです。 IE。 LIMIT 1を実行すると、経費項目を1つだけ受け取りますが、それに関連するすべてのトランザクションを取得します。

これはどのように達成されますか?

この段階で、LIMIT 1を実行すると、費用は1つ、トランザクションは1つだけになります。

23
Thomas R

したがって、ユーザーテーブルを除外できると仮定すると、次のように書き直すことができます。

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;

ベン

13
Ben

取得したいexpenseアイテムを指定する必要があります。最も高価な?最新の?次に、それだけを返すサブクエリに対して結合します。

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

SQLサーバーのアップグレードはオプションではないため、2つのクエリを実行することになります。

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

これは古いものですが...検索でこれに遭遇し、サブクエリで制限を使用できないことを考慮して、いくつかの考えを追加すると思いました...

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
0
jschicago