Ограничение SQL-соединения - PullRequest
22 голосов
/ 30 января 2009

Я пытаюсь ограничить следующую инструкцию SQL.

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

Что я хочу сделать, так это ограничить количество «родительских» строк. IE. если я выполню LIMIT 1, я получу только одну статью расходов, но все равно получу все транзакции, связанные с ней.

Как бы этого достичь?

На этом этапе, если я выполняю LIMIT 1, я получаю один расход и только одну транзакцию.

Ответы [ 3 ]

12 голосов
/ 30 января 2009

Таким образом, предполагая, что мы можем исключить пользовательскую таблицу, она может быть переписана как:

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)

Будет ли это делать то, что вы хотели? Очевидно, вы должны быть осторожны с тем, в каком порядке будут возвращаться ваши cost_ids, поэтому вы, вероятно, захотите использовать ORDER BY.

Редактировать: Учитывая ограничение MySQL, описанное в вашем комментарии ниже, возможно, это будет работать:

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

Ben

7 голосов
/ 30 января 2009

Вам нужно будет указать, какой расход предмет вы хотите получить. Самый дорогой? Новейший? Затем присоединитесь к подзапросу, который возвращает только следующее:

SELECT
    expense.*, transaction.*, user.*
FROM
    (SELECT * FROM expense WHERE ...) AS expense
INNER JOIN
    transaction ON expense_id = transaction_expense_id
2 голосов
/ 30 января 2009

Поскольку обновление SQL-сервера не является вариантом, я могу в итоге выполнить два запроса.

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