IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Besoin d'une aide dans l'élaboration d'une requête : problèmes entre les liaisons


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Besoin d'une aide dans l'élaboration d'une requête : problèmes entre les liaisons
    Bonjour à tous,


    Tout d'abord merci à ceux et celles qui prendront le temps de lire mon appel à l'aide et m'aideront à le solutionner.
    Je pense que ça ne doit pas être très méchant, mais après plusieurs heures de recherches et de tentatives infructueuses, je commence à caler sévère...

    Le soucis est certainement dû aux liaisons entre les tables.
    Voilà donc la structure de ma base et ce que je voudrais :
    - J'ai une table nommée "photo" dans laquelle sont référencées l'ensemble des photos d'une bibliothèque. Dans le cas ou un objectif photo à était utilisé, il y a comme valeur l'ID de celui-ci dans le champ "id_objectif". Si aucun n'a était utilisé, la valeur du champ est NULL.
    - J'ai une autre table nommée "accessoire" dans laquelle sont référencés les différents accessoires que l'on peut utiliser.
    - Enfin, une troisième table nommée "utiliser" dans laquelle le lien est fait entre l'ID de la photo et le ou les accessoires utilisés pour ce cliché.

    Je fais une requête ou je veux uniquement les photos dont l'objectif utilisé ID#3 par exemple à était utilisé.

    La requête suivante me retourne un résultat correct de 63 lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM photo WHERE id_objectif = 3
    Maintenant, si j'effectue le même critère mais en faisant le lien avec la table utiliser, je me retrouve avec seulement 5 lignes !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM photo, utiliser WHERE photo.id_photo = utiliser.id_photo AND id_objectif = 3
    Dans ce second exemple, la liaison avec la table "utiliser" ne sert à rien, je vous l'accorde. Mais je veux garder ce lien car les prochaines requêtes doivent se faire en appliquant le critère sur l'objectif utiliser, mais également sur les accessoires utilisés. La requête que je prévoyais d'écrire est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM photo, utiliser WHERE photo.id_photo = utiliser.id_photo AND id_objectif = 3 AND id_accessoire IN (5, 9, 3)
    Le problème vient certainement du type de liaison entre mes tables, mais après plusieurs essais entre INNER JOIN, JOIN, LEFT INNER JOIN... je bloque toujours.
    Petite précision, dans la table utiliser peut se trouver plusieurs lignes avec le même ID photo, du fait que plusieurs accessoires peuvent être utilisés pour une seule et même photo.
    Je voudrai éviter également de devoir faire un UNION car pour l'explication du problème j'ai synthétisé la requête mais il y a en fait plusieurs liens entre des tables et des champs affichés.
    Je suis pour autant certain que le problème provient de ce que je viens de vous décrire car j'ai décomposer ma requête pour voir quelle partir posait problème.

    Vous remerciant d'avance pour votre précieuse aide.

    Séb

    P.S : J'anticipe la question si vous souhaitez tout de même la requête complète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DISTINCT PHOTO.id_photo AS id_photo, PHOTO.nom AS nom_photo, repertoire_parent, localisation_approximative, date_prisedevue, heure_prisedevue, date_insertion, datetime_modification, note, bracketing, panoramique, descriptif, hauteur, largeur, orientation, focale, ouverture, vitesse, programme, iso, blancs, flash, style, mesure, fichier_raw, fichier_dpp, fichier_psd, fichier_tiff, LIEU.nom AS nom_lieu, REGION.nom AS nom_region, PAYS.nom AS nom_pays, BOITIER.fabricant AS fabricant_boitier, BOITIER.modele AS modele_boitier, OBJECTIF.fabricant AS fabricant_objectif, OBJECTIF.modele AS modele_objectif
    FROM lieu LIEU, region REGION, pays PAYS, boitier BOITIER, utiliser UTILISER, photo PHOTO LEFT OUTER JOIN objectif OBJECTIF ON PHOTO.id_objectif = OBJECTIF.id_objectif 
    WHERE PHOTO.id_lieu = LIEU.id_lieu 
    AND LIEU.id_region = REGION.id_region 
    AND REGION.id_pays = PAYS.id_pays 
    AND PHOTO.id_boitier = BOITIER.id_boitier 
    AND UTILISER.id_photo = PHOTO.id_photo 
    AND PHOTO.id_objectif = 3 
    ORDER BY nom_photo DESC

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Si tu utilises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM photo, utiliser WHERE photo.id_photo = utiliser.id_photo AND id_objectif = 3
    il n'y a rien de surprenant qu'elle ne renvoie que 5 lignes puisqu'il s'agit d'une requête INNER (Ce type d'écriture n'est PLUS du tout la norme depuis quelques décennies ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM photo
        LEFT JOIN utiliser ON (photo.id_photo = utiliser.id_photo)
    WHERE id_objectif = 3
    Dans la toute dernière requête, penses à faire tes jointures en suivant la norme


    a+

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Salut Olivier,

    Merci pour la rapidité de réponse !
    En effet cela provenait de ma jointure qui n'était pas correcte. Je viens de faire le test et je me retrouve avec les 63 lignes que je voulais !!

    Après avoir fais une recherche sur le net, non loin de là que je mettais ta parole en doute, la jointure de type INNER date de 1986 !! Ils préconisent en effet d'arrêter de faire des jointures avec la clause WHERE.
    Merci donc au programme scolaire et aux profs qui nous enseignent l'ancienne et obsolète méthode, il y a de ça encore 6 ans !

    A bon entendeur, je ne souhaite pas lever le débat sur les qualités et défauts de l'enseignement.

    Merci encore donc !
    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/11/2014, 16h44
  2. Réponses: 3
    Dernier message: 28/06/2013, 16h42
  3. [AC-2003] Besoin d'aide dans la conception d'une base de données
    Par Fifille dans le forum Modélisation
    Réponses: 1
    Dernier message: 10/10/2011, 15h30
  4. Réponses: 2
    Dernier message: 23/05/2010, 12h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo