Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/04/2007, 11h31   #1
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
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" ?
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 11h37   #2
Membre chevronné
 
Avatar de nako
 
Ingénieur développement logiciels
Inscription : août 2003
Messages : 581
Détails du profil
Informations personnelles :
Localisation : France

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

Informations forums :
Inscription : août 2003
Messages : 581
Points : 635
Points : 635
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+
nako est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 11h51   #3
Membre éclairé
 
Inscription : juillet 2003
Messages : 338
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 338
Points : 339
Points : 339
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!!!
tatareau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 11h56   #4
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
Ma requête SQL est du genre :
Code SQL :
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
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 12h01   #5
Membre éclairé
 
Inscription : juillet 2003
Messages : 338
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 338
Points : 339
Points : 339
Tentes du genre
Code SQL :
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 :
1
2
3
SELECT *
FROM pc
NATURAL LEFT JOIN marque, modele

tatareau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 12h11   #6
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
Ah ok, je ne connaissais pas ce genre de requête :
Code SQL :
1
2
3
SELECT *
FROM pc
NATURAL LEFT JOIN marque, modele
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 12h14   #7
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

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

Code SQL :
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 !
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 13h51   #8
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
J'ai essayer de faire ce genre de requete

Code SQL :
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 :
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...
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 14h30   #9
Membre éclairé
 
Inscription : juillet 2003
Messages : 338
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 338
Points : 339
Points : 339
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 .


tatareau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 15h18   #10
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
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...
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 15h27   #11
Membre éclairé
 
Inscription : juillet 2003
Messages : 338
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 338
Points : 339
Points : 339
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 :
SELECT DISTINCT * FROM maTableGauche
Le distinct supprime les doublons, mais est très couteux en temps...
tatareau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2007, 11h03   #12
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
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
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2007, 16h10   #13
Membre éclairé
 
Inscription : juillet 2003
Messages : 338
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 338
Points : 339
Points : 339
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 :
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...
tatareau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2007, 16h38   #14
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
Tu vas devenir fou, j'en ai 6 x 2 lignes répéter... !!!

Je ne comprend rien à ce truc !!
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2007, 17h59   #15
Membre éclairé
 
Inscription : juillet 2003
Messages : 338
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 338
Points : 339
Points : 339
Kawabunga , c'est parce que l'on joint sur deux tables:
Code SQL :
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
tatareau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2007, 09h04   #16
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
Tu sais quoi ?



Tu es un dieu ! lol

Nikel ca fonctionne ! merci !

Ralla sacré requête de ... ! lol
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2007, 09h24   #17
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
ok voici ma requete presque complete :

Code :
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 ?
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2007, 09h50   #18
Expert Confirmé

 
Avatar de Amara
 
Inscription : juillet 2004
Messages : 2 684
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : juillet 2004
Messages : 2 684
Points : 2 910
Points : 2 910
Tu rajoutes un WHERE à la fin nan ?

Code :
WHERE modele.modele_id_marque = marque.id_marque
__________________
Pas de questions techniques par MP, le forum est là pour ça et est plus efficace.

Orthographe : une connexion (avec un x), un langage (sans u), une requête (un seul t), 'une quote' (avec qu), une syntaxe (sans h)
Amara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2007, 10h18   #19
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
Yes, it's good !

Merci bcp à vous !
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h14.


 
 
 
 
Partenaires

Hébergement Web