30

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

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

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

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

この段階で、LIMIT 1 を実行すると、1 つの費用と 1 つのトランザクションのみが発生します。

4

4 に答える 4

17

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

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;

ベン

于 2009-01-30T09:46:10.400 に答える
10

取得する費用項目を指定する必要があります。最も高価な?最新の?次に、それだけを返すサブクエリに対して結合します。

SELECT
    expense.*, transaction.*, user.*
FROM
    (SELECT * FROM expense WHERE ...) AS expense
INNER JOIN
    transaction ON expense_id = transaction_expense_id
于 2009-01-30T09:47:36.527 に答える
2

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

expenses = SELECT * FROM expense ... LIMIT x
foreach expenses as expense
    expense.transactions = SELECT * FROM transacion WHERE transaction_expense_id = expense.expense_id
于 2009-01-30T09:55:40.317 に答える