Dans ce chapitre, nous allons voir le concept de table dérivée. La table dérivée est en réalité une table virtuelle. Elle n’existe pas dans la base de données. Elle est en effet stockée temporairement à l’aide d’un alias.

db_blog_short

Figure 3.1 : schéma de base de données

1. Table dérivée

Supposons que nous aimerions obtenir le nombre de likes et le nombre de commentaires qu’a chaque post (article).

SELECT P.ID, P.post_title, derivLikes.nbLikes, derivComm.nbComments
FROM Posts AS P
LEFT JOIN
   ( SELECT post_ID, COUNT(*) AS nbLikes
     FROM Likes
     GROUP BY post_ID ) AS derivLikes ON P.ID = derivLikes.post_ID
LEFT JOIN 
   ( SELECT post_ID, COUNT(*) AS nbComments
     FROM Comments
     GROUP BY post_ID ) AS derivComm ON P.ID = derivComm.post_ID

On obtient le tableau suivant.

{{h}}
{{r}}

Explicitons comment fonctionne la construction d’une table dérivée. Ici deux tables dérivées ont été construites. La première contient le nombre de likes qu’a chaque post et la seconde le nombre de commentaires qu’a chaque post. On assigne un nom à ces tables dérivées avec un alias. Dans le cas présent, derivLikes et derivComm. Finalement, on fait des jointures externes pour agréger les données de la table Posts et des deux tables dérivées.

2. Nettoyage

Maintenant on veut juste afficher un 0 lorsqu’aucune correspondance n’a été trouvée dans les jointures externes. On peut utiliser la fonction IFNULL pour ça.

SELECT P.ID, P.post_title, IFNULL(derivLikes.nbLikes,0) AS Likes, IFNULL(derivComm.nbComments,0) AS Comments
FROM Posts AS P
LEFT JOIN
   ( SELECT post_ID, COUNT(*) AS nbLikes
     FROM Likes
     GROUP BY post_ID ) AS derivLikes ON P.ID = derivLikes.post_ID
LEFT JOIN 
   ( SELECT post_ID, COUNT(*) AS nbComments
     FROM Comments
     GROUP BY post_ID ) AS derivComm ON P.ID = derivComm.post_ID

On obtient le tableau suivant.

{{h}}
{{r}}

Récap

Une table dévivée est le résultat d’une requête SQL qui est temporairement stocké à l’aide d’un alias.

Tout comme pour les sous-requêtes, les tables dérivées sont utilisées lorsqu’un résultat intermédiaire est nécessaire pour accomplir une certaine principale.

La fonction IFNULL mentionnée ci-dessus est la manière de faire avec MySQL et MariaDB uniquement. Les autres SGDBR‘s ont une façon de faire qui diffère légèrement.