Mysql…Les bases. (2)

Pour les exemples suivants, on s’appuiera sur ces tables :

USER
id_user nom_user auteur
1 Dan 1
2 Monique 0
3 Cariboo 0
4 Anonymus 1
5 BZHCool 0
6 Marie 1
ARTICLES
id_page titre texte id_user
1 HTML Rendre son site accessible … 2
2 Url rewriting Pour ecrire une url sans… 1
3 Mysql L’utilisation d’une base de… 4
LU
id_page id_user
1 1
2 1
1 2
3 5

Leur signification est sans surprises :

La table ‘user est la table contenant la liste des membres d’un site (quelconque). Chaque membre a un identifiant, un nom et un statut : Soit c’est un auteur (auteur=1) et il a le droit d’écrire un article, soit ce n’est pas un auteur (auteur=0). Dans le script, on pourra dire :

Si auteur=1 alors ‘voulez vous ajouter un article ?’

La table ‘article’ est sans surprises non plus. Un numéro identifiant, le titre de l’article, le texte de l’article, et le numéro identifiant de l’auteur de l’article.

La table ‘lu’ permet de savoir quels articles ont été lu, et par qui. On y retrouve donc l’identifiant des articles, et l’identifiant des membres. On y apprend par exemple que le membre n° (), a lu l’article n° ().

En pratique, par la suite, on pourreze dire à un membre : Vous avez lu tel et tel article, et vous n’avez pas lu tel et tel autre.

Clause SELECT…FROM…WHERE

Pour lire une table, il faut l’interroger. Pour cela, on utilise la clause SELECT.

On sélectionne les champs qui nous intéressent, puis la table dans laquelle ces champs on été pris, et s’il y en a, on donne les conditions. Un exemple ?

On veut la liste de tous les utilisateurs. Ce qui nous intéresse, c’est le nom des utilisateurs. Donc il nous faut deux informations : « nom_user » et le nom de la table où se trouve ce nom, la table « USER ». Il n’y a pas de conditions, donc il n’y aura pas de clause WHERE. La requète donnera :

SELECT nom_user FROM USER

L’explication est simple : Sélectionner le champ nom_user dans la table USER. On pourrait aussi avoir besoin du champ id_user. La requète donnera :

SELECT id_user,nom_user FROM USER

ou avec les champs dans un ordre différent :

SELECT nom_user,id_user FROM USER

La réponse de la base de données sera :

id_user nom_user
1 Dan
2 Monique
3 Cariboo
4 Anonymus
5 BZHCool
6 Marie

Autrement dit : la liste des utilisateurs.

On peut aussi vouloir la liste des utilisateurs (comme précédemment), mais avec une condition. Que cet utilisateur soit un auteur. On utilisera donc le WHERE. La condition pour qu’un utilisateur soit auteur, c’est que le champ « auteur » de la base « USER » soit à « 1 ». La requète se fera ainsi :

SELECT nom_user,id_user FROM USER WHERE auteur=1 ;

La réponse de la base sera

id_user nom_user
1 Dan
4 Anonymus
6 Marie

Le champ « auteur » n’apparait pas, puisqu’il n’est pas mentionné dans le SELECT. Les utilisateurs dont le champ « auteur » est à « 0 » n’apparaissent pas non plus, puisque la condition WHERE ne le permet pas.

Jointure

La clause where permet donc de mettre des conditions. Il est ainsi possible de faire des jointures entre les tables, de sorte que, lorsque l’on demande le nom de l’utilisateur, et le titre de l’article, les informations retournées par la base soient cohérentes.

Sans jointure, faire une requète du style :

SELECT nom_user,titre FROM user,articles

retournerait le nom de tous les utilisateurs, associé à tous les titres de tous les articles. C’est ce qu’il nous faut, sauf qu’en plus, on veut une condition.

On veut : le titre, et l’utilisateur associé au titre. Autrement dit, pour chaque titre, on veut le nom de son auteur.

Condition :

A condition qu’il ait écrit l’article.

On retrouve, dans la table ‘articles’, le champ id_user. Ce champ fait implicitement référence au champ id_user de la table ‘user’. Il nous faut donc le déclarer explicitement, de cette façon :

SELECT nom_user, titre

FROM user,articles

WHERE user.id_user=articles.id_user

Le résultat de la base sera :

nom_user titre
Monique HTML
Dan Url rewriting
Anonymus Mysql

et correspondra à la demande :

Selectionner le nom de l’utilisateur, et le titre de l’article, dans les tables user et articles, avec la condition que le champ id_user de la table user et le champ id_user de la table articles correspondent. Et ça marche !

On aurait pu mettre une seconde condition :

SELECT nom_user, titre

FROM user,articles

WHERE user.id_user=articles.id_user

AND auteur=1

Mais il est évident que seuls les auteurs auront un article, donc ce serait redondant, et donc inutile dans ce cas.

Autre exemple, avec plusieurs jointures :

Je disais, plus haut, que la table ‘lu’ permet de répondre à la question : qui a lu quoi.

Pour cela, nous devons utiliser la table ‘lu’, associée aux tables user et articles. On sélectionnera le nom_user, pour avoir le nom de l’utilisateur, puis le titre, pour connaitre le nom de l’article, puis on se servira de la table jointure ‘lu’, qui permet de relier les articles aux utilisateurs. La requète sera :

SELECT nom_user,titre

FROM user,articles,lu

WHERE user.id_user=lu.id_user

AND lu.id_page=articles.id_page

En sortie, la base nous délivrera le résultat suivant :

nom_user titre
Dan HTML
Monique HTML
Dan Url rewriting
Cariboo Mysql

Il correspond aux titres des articles, avec le nom des personnes qui les ont lu. Les utilisateurs n’ayant rien lu n’apparaitront pas, de même que les articles n’ayant pas été lu.

Le prochain article sera consacré aux clauses : Order by et limit, pour savoir comment ordonner les résultats, et limiter la taille des données renvoyées par la base de données.