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

PHP & Base de données Discussion :

[SQL] Forcer l'affichage d'une table SQL malgrès des collones (jointure) vide


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut [SQL] Forcer l'affichage d'une table SQL malgrès des collones (jointure) vide
    Bonjour,

    J'ai une table Mysql avec plusieurs collones. Certaines collones pointes vers d'autres tables.

    Exemple : Table "PC"

    id_pc | hostname | marque | modele ...
    ..1.......AKF1245.......3...........2.........

    marque > marque.id_marque
    modele > modele.id_modele

    Lorsque la table est complètement rempli, aucun problème pour la visualiser, par contre si la collone "marque" et/ou "modele" n'est pas renseigné, impossible de visualiser la table "PC".

    Le problème vient des jointures "marque et "modele", mais comment forcer l'affichage des données malgrès l'absence de données de les colonne "marque" et "modele" ?

  2. #2
    Membre éclairé Avatar de nako
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2003
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2003
    Messages : 577
    Points : 663
    Points
    663
    Par défaut
    Salut,
    Il s'agit d'une question concernant les bases de données pures.
    Cependant :
    il faut que tu utilises les jointures à droite ou à gauche selon ta requête.
    Une petite recherche sur ce forum (avec les mots clés "left join", dans la section Base de données bien sûr ! devrait te donner des réponses).
    a+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 343
    Points : 392
    Points
    392
    Par défaut
    Je ne connais pas ta requete SQL, mais il semble que tu as un problème de jointure externe.
    si tu as deux tables maTableGauche et maTableDroite avec des donnèes qui n'existent pas dans la table maTableDroite (cad qui ne satisfont pas les conditions de jointures)
    Recherche ce type de jointure
    SELECT a,b
    FROM maTableGauche LEFT JOIN maTableDroite ON Condition de jointure

    Si a existe dans maTableGauche mais n'a pas de correspondance dans maTableDroite, dans une jointure classique, la ligne n'apparait pas mais avec LEFT JOIN la ligne apparait avec le champs de la maTableGauche et la valeur NULL pour le champ de maTableDroite
    si j'ai pu t'aider

    Le temps que j'écrive nakko t'a répondu!!!

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Ma requête SQL est du genre :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM pc, marque, modele
    WHERE marque=id_marque
    AND modele=id_modele

    etc...

    Je vais relire vos réponses, car j'ai pas bien tout compris...

    Merci pour vos réponses !

    Arnaud

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 343
    Points : 392
    Points
    392
    Par défaut
    Tentes du genre
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM pc
    LEFT JOIN marque, modele
    ON pc.marque=marque.id_marque
    AND pc.modele=modele.id_modele


    et si tu appelles des attributs du même nom dans les tables pc, marque et modele tu peux faire tout simplement
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM pc
    NATURAL LEFT JOIN marque, modele


  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Ah ok, je ne connaissais pas ce genre de requête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM pc
    NATURAL LEFT JOIN marque, modele

  7. #7
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    pour info voici ma vrai requête... j'avais essayé d'adapter ce que tu m'as expliquer à cette requête...

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    			 FROM inventaire_pc, marque, modele, os, situation, utilisateur, batiment, etage
    			 WHERE inventaire_pc.pc_modele = id_modele
    			 AND modele_id_marque = id_marque
    			 AND inventaire_pc.os = id_os
    			 AND inventaire_pc.situation = id_situation
    			 AND inventaire_pc.batiment = id_batiment
    			 AND inventaire_pc.etage = id_etage
    			 AND inventaire_pc.utilisateur = id_utilisateur

    Merci beaucoup pour ta réactiviter !

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    J'ai essayer de faire ce genre de requete

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM pc
    LEFT JOIN marque, modele
    ON pc.marque=marque.id_marque
    AND pc.modele=modele.id_modele

    sur ma requête.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT *
    FROM inventaire_pc
    LEFT JOIN marque, modele, os, situation, utilisateur, batiment, etage
    ON inventaire_pc.pc_modele = id_modele
    AND modele_id_marque = id_marque
    AND inventaire_pc.os = id_os
    AND inventaire_pc.situation = id_situation
    AND inventaire_pc.batiment = id_batiment
    AND inventaire_pc.etage = id_etage
    AND inventaire_pc.utilisateur = id_utilisateur

    La base me renvoie plein d'enregistrement et ce met à ramé.. j'ai du mal écrire ma requête...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 343
    Points : 392
    Points
    392
    Par défaut
    C'est un peu normal, tu vas avoir tous les champs (*) et toutes lignes de ta table inventaire_pc (c'est le rôle de maTableGauche et c'est le but du LEFT) car on a forcé même s'il n'y a pas de marques et modèles etc. dans les tables du genre maTableDroite.
    En revanche, ces champs de maTableDroite sont renvoyés avec la valeur NULL qui peuvent être testés .



  10. #10
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Bah en faite oui ca devrai faire ce que tu m'expliques mais la, j'ai que deux enregistrements, et la requête me sort mes deux enregistrements plusieurs fois de suite (3741696 de fois !!! )

    Je ne comprend pas trop...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 343
    Points : 392
    Points
    392
    Par défaut
    Tu as plusieurs fois le même modèle ou autres champs de la table inventaire_pc? essaye en ajoutant la clause distinct apres le select
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT * FROM maTableGauche
    Le distinct supprime les doublons, mais est très couteux en temps...

  12. #12
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Non, ca donne rien, ca rame encore plus car il m'affiche pleins d'enregistrements alors que j'ai que deux enregistrements ds la table.

    En fichier joint, je te montre le schéma de ma base

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 343
    Points : 392
    Points
    392
    Par défaut
    Je vois dans ton schéma un peu de redondance d'information, mais cela pour sans doute faire des requêtes plus courtes, et des contraintes fortes...Si par exemple un utilisateur travaille sur deux étages il faudra qu'il existe deux fois dans la base, si un pc est utilisé par plus d'une personne il faudra autant de inventaire_pc...Je m'occupe de ce qui ne regarde pas
    Dans inventaire pc tu n'as que deux lignes???
    essaye
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT *
    FROM inventaire_pc
    LEFT JOIN os, modele
    ON (inventaire_pc.inventaire_pc_id_modele = modele.id_modele
    AND inventaire_pc.inventaire_pc_id_os = os.id_os)
    tu devrais avoir que deux lignes! Bon j'abrège , faut que je fasse autre chose Je reprends plus tard...

  14. #14
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Tu vas devenir fou, j'en ai 6 x 2 lignes répéter... !!!

    Je ne comprend rien à ce truc !!

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 343
    Points : 392
    Points
    392
    Par défaut
    Kawabunga , c'est parce que l'on joint sur deux tables:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT * 
     FROM inventaire_pc 
     LEFT JOIN  modele ON 
     inventaire_pc.inventaire_pc_id_modele = modele.id_modele 
     LEFT JOIN os ON
     inventaire_pc.inventaire_pc_id_os = os.id_os

  16. #16
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Tu sais quoi ?



    Tu es un dieu ! lol

    Nikel ca fonctionne ! merci !

    Ralla sacré requête de ... ! lol

  17. #17
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    ok voici ma requete presque complete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    SELECT DISTINCT *
     
    FROM inventaire_pc
     
    LEFT JOIN modele ON 
    inventaire_pc_id_modele = id_modele
     
    LEFT JOIN os ON
    inventaire_pc_id_os = id_os
     
    LEFT JOIN situation ON
    inventaire_pc_id_situation = id_situation
     
    LEFT JOIN utilisateur ON
    inventaire_pc_id_utilisateur = id_utilisateur
     
    LEFT JOIN batiment ON
    inventaire_pc_id_batiment = id_batiment
     
    LEFT JOIN etage ON
    inventaire_pc_id_etage = id_etage
    Par contre, la table "MODELE" est associer à la table "MARQUE".
    (modele.modele_id_marque = marque.id_marque)

    Comment je peux faire pour l'intégrer à ma requête exsitante ?

  18. #18
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut
    Tu rajoutes un WHERE à la fin nan ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE modele.modele_id_marque = marque.id_marque

  19. #19
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Yes, it's good !

    Merci bcp à vous !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/12/2009, 09h25
  2. Réponses: 5
    Dernier message: 09/07/2008, 17h04
  3. Réponses: 5
    Dernier message: 02/05/2008, 14h46
  4. [SQL] Supprimer les lignes d'une table sql
    Par radhwene dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/06/2007, 11h48
  5. [DEB.] - Transposer une table SQL en XML SCHEMA ???
    Par oulahoup dans le forum Valider
    Réponses: 2
    Dernier message: 10/06/2003, 15h11

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