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 |
---------------------
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
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.
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.
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