Webmaster Hub
Rechercher dans les publications Rechercher:

Imprimer cet article

Mysql...Les bases. (2)

Mysql...Les bases. (2)

La clause SELECT FROM WHERE

11 mai 2004, par

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

USER
id_usernom_userauteur
1Dan1
2Monique0
3Cariboo0
4Anonymus1
5BZHCool0
6Marie1
ARTICLES
id_pagetitretexteid_user
1HTMLRendre son site accessible ...2
2Url rewritingPour ecrire une url sans...1
3MysqlL’utilisation d’une base de...4
LU
id_pageid_user
11
21
12
35

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_usernom_user
1Dan
2Monique
3Cariboo
4Anonymus
5BZHCool
6Marie

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_usernom_user
1Dan
4Anonymus
6Marie

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_usertitre
MoniqueHTML
DanUrl rewriting
AnonymusMysql

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_usertitre
DanHTML
MoniqueHTML
DanUrl rewriting
CaribooMysql
......

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.