Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

UN EXEMPLE CONCRET: 2 TABLES, 1 REQUETE, 1 TRIE ALPHABETIQUE, 1 ORDRE DE TRIE


Information sur la source

Catégorie :Divers Classé sous : exemple, classer, access Niveau : Débutant Date de création : 05/10/2004 Date de mise à jour : 05/10/2004 09:57:09 Vu : 7 672

Note :
7,5 / 10 - par 4 personnes
7,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

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

  • 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
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 :)
 

Historique

05 octobre 2004 09:57:10 :
Ajout d'une annotation

Commentaires et avis

signaler à un administrateur
Commentaire de Rastaquouere le 17/10/2004 17:55:42

Pas de souci Lumesh, c'est très clair !

signaler à un administrateur
Commentaire de lauchris1 le 07/01/2005 08:53:48

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

signaler à un administrateur
Commentaire de SATANdemon le 30/11/2005 14:26:00

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Oracle vs Sql server vs Access [ par Fildomen ] salutpouvez-vous me donner le comparatif entre ces trois (Oracle,Sql server,Access)?? et qui es le plus rapide entre eux(un classement)?mercihttp://ww Requete INSERT sous ACCESS [ par Fredon88 ] J'ai une requete SQL sous ACCESS a faire je dois faire une requete d'insertion dans la table client qui contient les champs suivant: -Client_num -Clie changer le nom d'un champ dans une base access [ par oluha ] BonjourJ'aimerai savoir s'il est possible de changer le nom d'un champ d'une base access avec une requête sql ?En cherchant sur le web j'ai trouvé ces access et modulo [ par citt ] Bonjour,Je cherche a sortir de ma base tout les enregistrements qui :frequence = 1,2 ou 4anné en cours = 0anné +1 = 1etc ..anné / frequence doit etre SQL access [ par abdoulax ] Je d&#233;bute en base de donn&#233;e. J'utilise Access qui poss&#232;de une gestion des requ&#234;tes avec SQL. Ce que je voudrai faire c'est r&#233; Ajout d'un description d'un champs pour access en sql [ par Jbs106 ] Salutationvoil&#224; mon souci:Dans access, quand on visualise une table, miz &#224; part le nom&nbsp;et le type du champs, il est possible d'ajouter Ecrire une requette SQL pour affichier les 3 derniers enregistements dans une table Access [ par hotlines ] Bonjour,je voudrais &#233;crire une requette SQL pour afficher&nbsp; les 3 derniersenregistrement dans une table Access,pour &#234;tre claire j'ai un Resultat requete Access dans interface VB?? [ par Sandy084 ] Salut tout le monde! Voila j'ai une requ&#233;te sur access que je n'arrive pas &#224; recopier correctement dans mon programme VB sans qu'il n'y est Help me please .. [ par yassine_java ] salut tout le monde , bon voila , j ai une application avec VB - ACCESS&nbsp; et je veux plus travailler avec access donc je veux convertir ma base de access [ par moreau_l ] &nbsp;&nbsp; Bonjour &#224; tous, J'ai fais une boulette sur ma base access (97), j'ai besoin d'aide. J'ai vir&#233; les menus et toutes les barres a


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,33 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.