2009-11-23 8 views
1

J'ai une base de données MySQL qui ressemble à ceci:Amorce SQL: pourquoi et comment utiliser les instructions de jointure?

users 
    (id , name) 
groups 
    (id , name) 
group_users 
    (id , group_id , user_id) 

Maintenant, pour rechercher tous les groupes auxquels appartient un utilisateur, je ferais quelque chose comme ceci:

select * from 'group_users' where 'user_id' = 47; 

Cela reviendra probablement quelque chose comme:

(1 , 3 , 47), 
(2 , 4 , 47), 

Mais quand je veux montrer cela à l'utilisateur, je vais vouloir afficher le nom des groupes qu'ils appartiennent à la place du group_id. Dans une boucle, je pourrais aller chercher chaque groupe avec le group_id qui a été retourné, mais cela semble être la mauvaise façon de le faire. S'agit-il d'un cas où une instruction join doit être utilisée? Quel type de joint dois-je utiliser et comment l'utiliser?

Répondre

7

En général , vous voulez réduire le nombre total de requêtes à la base de données, en faisant chaque requête faire plus. Il y a plusieurs raisons pour lesquelles c'est une bonne chose, mais la principale est que les systèmes de gestion de base de données relationnelle sont spécifiquement conçus pour pouvoir joindre des tables rapidement et sont meilleurs que le code équivalent dans une autre langue. Une autre raison est qu'il est généralement plus coûteux d'ouvrir beaucoup de petites requêtes que de lancer une grande requête qui a tout ce dont vous aurez besoin. Vous souhaitez tirer parti des atouts de votre SGBDR. Vous devriez donc essayer d'y accéder en quelques grosses requêtes plutôt que de nombreuses petites requêtes.

Maintenant, c'est juste une règle générale. Il y a des cas où il est préférable de faire certaines choses en dehors de la base de données. Il est important que vous déterminiez quel est le bon cas pour votre situation en examinant les goulots d'étranglement si et seulement s'ils se produisent. Ne perdez pas votre temps à vous soucier des performances avant de trouver un problème de performance. Toutefois, en général, il est préférable de gérer les jointures, les recherches et toutes les autres tâches liées aux requêtes dans la base de données elle-même plutôt que de tenter de les gérer dans un langage généraliste.

Cela dit, le type de joint que vous voulez est une jointure interne. Vous structurez votre requête de jointure comme ceci:

SELECT groups.name, group_users.user_id 
FROM group_users 
INNER JOIN groups 
    ON group_users.group_id = groups.group_id 
WHERE groups.user_id = 47; 
+0

Qu'arrive-t-il au jeu de résultats après qu'il a été joint? Des colonnes sont-elles ajoutées? Ou les valeurs d'id sont-elles remplacées par les valeurs de nom? – Andrew

+0

Je ne suis pas entièrement sûr de ce que vous demandez. Les colonnes ne sont ajoutées que si vous indiquez au serveur de les ajouter. Les ID ne sont pas remplacés par des noms. Les valeurs de la base de données restent inchangées lors des requêtes SELECT. Les choses ne peuvent être remplacées que si vous utilisez une instruction 'UPDATE'.Ce qui se passera dans cette requête d'exemple spécifique est que votre jeu de résultats contiendra les noms de tous les groupes associés à l'utilisateur dont l'identifiant est 47. Il n'y a pas d'ajout, de remplacement ou de quoi que ce soit de sournois. Juste une requête régulière retournant un ensemble de résultats. – Welbog

+0

Peu importe, j'ai trouvé la réponse à ma question. L'instruction select détermine quelles colonnes sont retournées, donc au lieu de dire 'select * from ...' je pourrais le réduire et ne retourner que le nom du groupe et l'id en disant 'select groups.name, groups.id from ...' – Andrew

1

C'est un cas typique pour une jointure interne, tels que:

select users.name, group.name from groups 
inner join group_users on groups.id = group_users.group_id 
inner join users on group_users.user_id = users.id 
where user_id = 47 
2
SELECT gu.id, gu.group_id, g.name, gu.user_id 
FROM group_users gu 
INNER JOIN Group g 
    ON gu.group_id = g.group_id 
    WHERE user_id = 47 
3

Je trouve toujours ces cartes très utile lorsque vous faites Jointures:

https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

+0

Merci! J'ai vraiment aimé ce post. Idéal pour les apprenants visuels comme moi. – Andrew

+0

Et il a des ninjas * et * des pirates! – Carra

+0

Ce lien n'a pas fonctionné pour moi mais je soupçonne que c'est cette page: https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ –

Questions connexes