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 :

Requete multi tables avec champs vides


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut Requete multi tables avec champs vides
    Bonjour,

    Je suis relativement nouveau dans le monde du sql, aussi je suis désolé d'avance si ma requête peut vous sembler déconcertante.
    Le but de ma base de données est de stocker des informations sur des cd d'archives d'une entreprise. L'entreprise effectue 1 sauvegarde par semaine sur CD, chaque CD contient des photos et des articles.

    Voici ma BDD :
    table CD (idcd, cdnom, cdmots)
    table Photo (phid, phnom, phmots, phdate, idcd#)
    table article (artid, artmots, idcd#)

    idcd, phid et artid sont les 3 clés primaires et correspondent à l'identifiant unique de chaque table. Chaque CD a un ID, un nom et un ensemble de mots-clés (pour une fonction de recherche), idem pour chaque article et chaque photo qui ont tous un ID, un nom et des mots-clés. chaque photo et chaque article a également une clé étrangère pour savoir sur quel CD ils se trouvent.

    Ce que je voudrais arriver à faire :
    Un simple affichage dans un tableau html de l'ensemble des articles et des photos présents sur chaque CD. L'utilisateur sélectionne le CD dans une liste, puis un tableau s'affiche avec chaque photo, leur nom, leur date, et leurs mots-clés, puis chaque article avec aussi leur nom et mots-clés.

    Le problème : tous les CD peuvent contenir à la fois des photos et des articles, ou alors soit l'un soit l'autre. Le tableau final peut donc contenir des cases vides.

    J'ai essayé des tas de requêtes SQL, ne connaissant que le basique "select from where"... mais apparemment ça ne suffit pas pour ce que je veux faire.

    Quelques exemples de requêtes "simplistes" que j'ai faites (oui je suis vraiment débutant) :

    SELECT cd.cdnom, cd.cdmots, photo.phnom, photo.phdate, article.artnom, article.artmots
    FROM cd, photo, article
    WHERE cd.idcd =1
    AND photo.idcd=1
    AND article.idcd=1

    en gros, j'essayais d'obtenir toutes les infos contenues sur le CD 1 mais ça "ne retourne aucun enregistrement", car il n'y a pas d'articles sur le CD1 donc article.idcd=1 ne donne rien. De même en mettant des OR ... IS NULL, le problème n'est pas résolu.

    J'ai aussi essayé avec des LEFT JOIN, le résultats affiché ne va pas non plus.

    Quelqu'un saurait m'aider ou m'aiguiller svp ? j'espère avoir pu exposer le problème assez clairement

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    Etant donné que les photos et les articles ont à peu près la même structure, vous pouvez modéliser celà avec de l'héritage. Ainsi vous aurez une table qui confond photos/articles et des tables qui définissent spécifiquement les photos et les articles.

    http://sqlpro.developpez.com/cours/m...tion/heritage/

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Merci pour votre réponse si rapide

    Malheureusement je n'ai pas le choix quant à la BDD, j'ai refait un modèle identique à celui déjà présent dans l'entreprise pour faire des tests, mais je ne peux pas toucher à la BDD de l'entreprise, je dois faire avec ce modèle qui m'a été donné (mon code sera appliqué à la vraie BDD une fois terminé).

  4. #4
    Membre chevronné Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT cd.cdnom, cd.cdmots, photo.phnom, photo.phdate, article.artnom, article.artmots
    FROM cd, photo, article
    WHERE cd.idcd =1
    AND photo.idcd=1
    AND article.idcd=1
    Deja tu dois pouvoir reecrire ta requete comme ca (plus propre je trouve)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT cd.cdnom, cd.cdmots, photo.phnom, photo.phdate, article.artnom, article.artmots
    FROM cd, photo, article
    WHERE cd.idcd =1
    AND photo.idcd=cd.idcd 
    AND article.idcd=cd.idcd
    Enfin essaye ces 2 left outer join
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT c.cdnom, c.cdmots, 
              p.phnom, p.phdate, 
               a.artnom, a.artmots
    FROM cd c,
         LEFT OUTER JOIN photo p 
            ON c.idcd=p.idcd  
    LEFT OUTER JOIN article a 
            ON c.idcd=a.idcd
    Je pense que la syntaxe est bonne mais je maitrise pas la notation SQL pure ( et oui Oracle quand tu nous tiens)

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Merci énormément, ça s'affiche^^ bon toutes les entrées s'affichent en double dans le tableau, mais au moins elles s'affichent où il faut. Vraiment merci beaucoup, un de ces jours j'espère bien pouvoir vous renvoyez l'ascenceur

  6. #6
    Membre chevronné Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Par défaut
    Citation Envoyé par zezette31 Voir le message
    Merci énormément, ça s'affiche^^ bon toutes les entrées s'affichent en double dans le tableau, mais au moins elles s'affichent où il faut. Vraiment merci beaucoup, un de ces jours j'espère bien pouvoir vous renvoyez l'ascenceur
    Deja lance la requete sous sql*plus ou autre pour voir le résultat

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

Discussions similaires

  1. Requete difficile multi table avec multi champ
    Par jujoluca dans le forum Requêtes
    Réponses: 9
    Dernier message: 07/06/2012, 19h59
  2. Requete multi table avec LIMIT et ORDER BY
    Par yobogs dans le forum Requêtes
    Réponses: 1
    Dernier message: 31/10/2006, 17h29
  3. requete avec champs vide
    Par le69 dans le forum Requêtes
    Réponses: 1
    Dernier message: 08/10/2006, 16h57
  4. [MySQL] Requete sur 2 tables avec champs commun
    Par marcd dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/04/2006, 16h14
  5. requete multi table - multi champ
    Par Jean-Matt dans le forum Oracle
    Réponses: 6
    Dernier message: 14/10/2005, 17h18

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