Limiter une jointure SQL

J'essaie de limiter L'instruction SQL suivante.

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

Ce que je veux faire, c'est limiter le nombre de lignes 'parents'. IE. si je fais une limite 1, Je ne recevrais qu'un seul élément de dépense, mais je recevrais toujours toutes les transactions qui y sont associées.

Comment cela serait-il réalisé?

À ce stade, si je limite 1, je reçois une dépense, et une seule transaction.

22
demandé sur Benjamin 2009-01-30 12:40:35

3 réponses

Donc, en supposant que nous pouvons exclure la table utilisateur, elle pourrait être réécrite comme:

select * from expense, transaction where expense_id = transaction_expense_id

Maintenant, si vous voulez appliquer une limite, vous pouvez le faire comme ceci:

select * from expense, transaction where expense_id = transaction_expense_id and 
  expense_id in (select expense_id from expense limit 1)

Est-ce que ça ferait ce que tu voulais? Évidemment, vous devez être prudent sur l'ordre dans lequel vos expense_ids vont revenir, donc vous voulez probablement utiliser ORDER BY whatever.

Edit: compte tenu de la limitation MySQL décrite dans votre commentaire ci-dessous, peut-être que cela fonctionnera:

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

Ben

12
répondu Ben 2009-01-30 09:58:51

, Vous aurez à spécifier dépense élément que vous souhaitez obtenir. Le plus cher? Le plus récent? Ensuite, Joignez-vous à une sous-requête qui ne renvoie que cela:

SELECT
    expense.*, transaction.*, user.*
FROM
    (SELECT * FROM expense WHERE ...) AS expense
INNER JOIN
    transaction ON expense_id = transaction_expense_id
8
répondu David Schmitt 2009-01-30 09:47:36

Puisque la mise à niveau du serveur SQL n'est pas une option, je peux finir par faire deux requêtes.

expenses = SELECT * FROM expense ... LIMIT x
foreach expenses as expense
    expense.transactions = SELECT * FROM transacion WHERE transaction_expense_id = expense.expense_id
2
répondu Thomas R 2009-01-30 09:55:40