Un exemple concret: 2 tables, 1 requete, 1 trie alphabetique, 1 ordre de trie

Soyez le premier à donner votre avis sur cette source.

Snippet vu 18 201 fois - Téléchargée 33 fois

Contenu du snippet

Il n'est pas rare de séparer ses enregistrements dans plusieurs tables de manière à bien les classer.
Ce qui devient génant c'est au moment de les récupérer.

Je m'explique:

Disons que nous avons 2 tables.
1) "auteurs"
2) "livres"

La table "auteurs" possède les champs:
1) "id" (INT 11, PRIMARY KEY, AUTO INCREMENT)
2) "nom" (VARCHAR 255)
3) "age" (INT 3)
4) "adresse" (TEXT)
5) "codepostal" (INT 5)
6) "ville" (VARCHAR 255)

La table "livres" possède les champs:
1) "id" (INT 11, PRIMARY KEY, AUTO INCREMENT)
2) "auteurid" (INT 11, INDEX)
3) "titre" (VARCHAR 255)
4) "description" (TEXT)

Le but de cet exercice est très simple: Lister les livres par ordre alphabetique (par "titre") dans l'ordre décroissant (de Z a A).
Le principe s'avère etre facile mais ce que l'on veut c'est accélérer ce listage. Pour cela nous allons utiliser qu'UNE SEULE requete.

Procédons par etape:

1) Lister les livres:

SELECT livres.id, livres.titre, livres.description FROM livres <- rien d'extraordinaire

2) on ajoute le trie par "titre":

SELECT livres.id, livres.titre, livres.description FROM livres ORDER BY livres.titre <- liste triée par "titre" (par defaut dans l'ordre croissant)

3) on inverse le trie, nous voulons par ordre d'écroissant:

SELECT livres.id, livres.titre, livres.description FROM livres ORDER BY livres.titre DESC <- et voila nous avons récupéré la liste des livres classée par titre dans l'ordre décroissant (remplacer le DESC par ASC pour inverser l'ordre)

Jusqu'a présent pas de grosses difiultées.
La où cela se complique c'est que nous voulions aussi afficher les auteurs de ces ouvrages.
(un livre ne s'écrit pas tout seul)

Plusieurs methodes sont possibles:

La plus utilisée consisterai à refaire une requete pour chercher les information de l'auteur en s'appuyant sur le champs "auteurid".
Le problème est que cela engendre un nouvel appel a la base de données pour chaque livre.
En gros double requetes ! Ce qui n'est pas recommandé si vous avez 5000 livres à lister ca peut etre lent.

La solution la plus adaptée (tout au moins je le pense) serai de tout récupérer en une seule requete:

4) Souvenez vous, pour lister les livres nous avions fait:

SELECT livres.id, livres.titre, livres.description FROM livres ORDER BY livres.titre DESC

L'auteur de chaque livre est renseigné par une valeur ce trouvant dans le champ "auteurid".
Cette valeur correspondant à un champ "id" de la table "auteurs".

Le SQL permet plus ou moins simplement de "lier" 1 requete à plusieurs tables.

5) Voici comment:

SELECT auteurs.nom, auteurs.age, auteurs.adresse, auteurs.codepostal, auteurs.ville, livres.id, livres.titre, livres.description
FROM auteurs LEFT JOIN livres ON auteurs.id = livres.auteurid
ORDER BY livres.titre DESC

Le principale changement est l'ajout de la jointure:

LEFT JOIN livres ON auteurs.id = livres.auteurid

Ce parametre signifie plusieurs choses:

LEFT JOIN dit au moteur SQL de joindre la table "auteurs" à la table "livres" (le RIGHT JOIN ferai l'inverse)
le auteurs.id = livres.auteurid permet de récupérer l'auteur correspondant au livre en cours de listage.

Donc voila.
En une requete nous avons récupéré la liste des livres, triée par "titre" dans l'ordre décroissant.
Nous pouvons meme afficher les informations concernant les auteurs de chaque livres listés.

Lier plusieurs tables entre elles est vraiment pratique. Il va vous permettre d'optimiser l'execution de votre code SQL et donc d'optimiser le listage des informations ce qui n'est pas négligeable dans une application ou un site internet.

Bien evidement vous pouvez lier plus de 2 tables entre elles mais la requette risque d'etre bien grande ;)

Source / Exemple :


SELECT auteurs.nom, auteurs.age, auteurs.adresse, auteurs.codepostal, auteurs.ville, livres.id, livres.titre, livres.description
FROM auteurs LEFT JOIN livres ON auteurs.id = livres.auteurid
ORDER BY livres.titre DESC

Conclusion :


Petite astuce:

Pour créer facilement des requettes avec des tables liées entre elles, je vous conseil d'utiliser Microsoft Access.
Par contre vraiment faire tres attention car suivant les moteurs SQL la synthaxe pourra varier legerement (MySQL, etc.)

Pour info: je suis tres nul a rediger des tutoriaux donc si personne ne comprend dites le SVP :) j'essaierai de refaire qqc de plus comprehensible :)

A voir également

Ajouter un commentaire

Commentaires

SATANdemon
Messages postés
44
Date d'inscription
mardi 18 décembre 2001
Statut
Membre
Dernière intervention
30 novembre 2005
-
lauchris1, ton code marche si tu rajoute OUTER devant ta table titre pour afficher les lignes meme si il n'y a pas d'infos :

SELECT auteurs.nom, auteurs.age, auteurs.adresse, auteurs.codepostal, auteurs.ville, livres.id, livres.titre, livres.description
FROM OUTER auteurs A , OUTER livres B where auteurs.id = livres.auteurid
ORDER BY livres.titre DESC
lauchris1
Messages postés
4
Date d'inscription
mardi 25 mai 2004
Statut
Membre
Dernière intervention
7 janvier 2005
-
Le LEFT JOIN a une utilité supplémentaire que de lire les enregistrements dans 2 tables.

L'avantage c'est que, même s'il n'y a pas d'enregistrement concordant dans la table B, les données de la table A s'affichent quand même et les zones de la table B sont à blanc

Contrairement au code qui suit où là, s'il n'y a pas d'enregistrement concordant dans la table B, les enregistrements de la table A ne s'affichent pas

SELECT auteurs.nom, auteurs.age, auteurs.adresse, auteurs.codepostal, auteurs.ville, livres.id, livres.titre, livres.description
FROM auteurs A , livres B where auteurs.id = livres.auteurid
ORDER BY livres.titre DESC
Rastaquouere
Messages postés
3
Date d'inscription
dimanche 27 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2004
-
Pas de souci Lumesh, c'est très clair !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.