web-dev-qa-db-fra.com

SQL JOIN plusieurs-à-plusieurs

Désolé pour le titre minimaliste mais je ne sais pas comment le décrire en bref. J'ai trois tableaux:

La table des groupes

ID | Genre
-----------------
1  | Action
2  | Adventure
3  | Drama

Table plusieurs à plusieurs

GroupID | ElementID
-----------------
    3   |    1
    1   |    2
    2   |    2
    2   |    3
    3   |    3

Et la table des éléments

ID | Element
-----------------
1  | Pride and Prejudice
2  | Alice in Wonderland
3  | Curious Incident Of A Dog In The Night Time

Tout va bien et très simple. Le SELECT que j'essaie d'atteindre est le suivant

ID | Element                                         |  Genre
-------------------------------------------------------------
1  | Pride and Prejudice                             | Drama
2  | Alice in Wonderland                             | NULL
3  | Curious Incident Of A Dog In The Night Time     | Drama

Je souhaite sélectionner tous les éléments du tableau Éléments et définir le champ genre sur Drame ou null.

J'essaie de le faire dans MySQL.

Merci d'avance

23
Martin Tramšak

C'est possible avec cette petite astuce (OUTER JOIN sur la table plusieurs-à-plusieurs, avec la contrainte que le GroupID doit être 3 (pour Drama)

http://sqlfiddle.com/#!2/b7c18/2

SELECT elements.ID, elements.Element, groups.Genre
  FROM elements
LEFT OUTER JOIN group_elements
  ON elements.ID = group_elements.ElementID
 AND group_elements.GroupID = 3
LEFT OUTER JOIN groups
  ON group_elements.GroupID = groups.ID

LEFT OUTER JOIN signifie: prendre toutes les lignes des tableaux qui ont précédé (celles qui se trouvent du côté GAUCHE du LEFT OUTER JOIN, si vous voulez), même si aucune ligne ne leur correspond dans les tableaux suivants. La condition ON elements.ID = group_elements.ElementID AND group_elements.GroupID = 3 dit que si nous trouvons quelque chose qui correspond à notre ElementID, ce doit aussi être un drame (GroupID = 3). Nous faisons ensuite une autre LEFT OUTER JOIN sur la table des groupes, ce qui nous permet d'afficher la colonne Genre, ou NULL si l'élément n'était pas un drame.

21
Miklos Aubert