web-dev-qa-db-fra.com

Renvoyer une seule ligne du tableau le plus à droite pour chaque ligne du tableau le plus à gauche

J'ai deux tables. Je veux les joindre de manière à ce qu'un seul enregistrement de la table de droite soit renvoyé pour chaque enregistrement de la table la plus à gauche. J'ai inclus un exemple ci-dessous. Je voudrais éviter les sous-requêtes et les tables temporaires car les données réelles sont d'environ 4 millions de lignes. Je ne me soucie pas non plus de l'enregistrement dans le tableau de droite qui correspond, tant qu'un ou aucun correspond. Merci!

utilisateurs de table:

-------------
| id | name |
-------------
| 1  | mike |
| 2  | john |
| 3  | bill |
-------------

transactions de table:

---------------
| uid | spent | 
---------------
| 1   | 5.00  |
| 1   | 5.00  |
| 2   | 5.00  |
| 3   | 5.00  |
| 3   | 10.00 |
---------------

production attendue:

---------------------
| id | name | spent |
---------------------
| 1  | mike | 5.00  |
| 2  | john | 5.00  |
| 3  | bill | 5.00  |
---------------------
24
Mike Sherov

Utilisation:

  SELECT u.id,
         u.name,
         MIN(t.spent) AS spent
    FROM USERS u
    JOIN TRANSACTIONS t ON t.uid = u.id
GROUP BY u.id, u.name

N'oubliez pas que cela ne retournera que les utilisateurs qui ont au moins un enregistrement TRANSACTIONS. Si vous voulez voir les utilisateurs qui n'ont pas d'enregistrements de support ainsi que ceux qui en ont - utilisez:

   SELECT u.id,
          u.name,
          COALESCE(MIN(t.spent), 0) AS spent
     FROM USERS u
LEFT JOIN TRANSACTIONS t ON t.uid = u.id
 GROUP BY u.id, u.name
42
OMG Ponies

Si vous ne vous souciez pas de la ligne particulière que vous récupérez.

select id, name, spent
from users
left join transactions on users.id = transactions.uid
group by id

Cela renverra une ligne par utilisateur. Ce sera la première transaction correspondante.

3
TheJacobTaylor

Voir SO 3305709 pour une question récente équivalente, avec un certain nombre de réponses raisonnables. Le SGBD cité est Postgres, mais les différences ici sont négligeables.

1
Jonathan Leffler

Mes excuses si cela ne répond pas vraiment à votre question. Il semble que vous essayiez de voir quels utilisateurs ont au moins une transaction. Vous pouvez le faire et voir dans le processus combien chaque utilisateur a dépensé en faisant quelque chose comme ceci:

 CHOISIR 
 U.id, 
 U.nom, 
 SOMME (t. Dépensé) COMME total 
 DE 
 UTILISATEURS u 
 OPÉRATIONS DE JOINTURE INTÉRIEURE t 
 ON t.uid = u.id 
 GROUP BY 
 U.id 
, U.name 
0
wshato