Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 11/09/2008, 11h38   #1
Membre à l'essai
 
Inscription : septembre 2006
Messages : 60
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Belgique

Informations forums :
Inscription : septembre 2006
Messages : 60
Points : 23
Points : 23
Par défaut OUTER JOIN: première valeur pas prise

Bonjour,

J'ai un problème en effectuant la requête suivante:

Code :
1
2
3
4
5
6
7
 
SELECT d.idbat, IFNULL(envie, 0) AS envie, IFNULL((29/30*diff_objectif),0) AS diff_objectif, IFNULL(SUM(nombre),0) AS nombre, IFNULL(j.prix,0) AS prix 
FROM jou_batiments j 
   RIGHT OUTER JOIN def_batiments d 
	ON j.idbat = d.idbat 
WHERE idjou='$id' OR j.idbat IS NULL
GROUP BY idbat
Elle est sensée prendre toutes les valeurs de def_batiment (d.idbat de 1 à 61) et y ajouter les valeurs de la table jou_batiments. C'est ce qu'elle fait, sauf qu'elle ne prend pas la valeur où d.idbat = 1! Le joint externe fonctionne parfaitement sur toutes les valeurs, sauf sur la première!

Vous pouvez m'aider pour que cette première valeur soit prise aussi?

Merci!

EDIT: j'ai continué les tests, et j'ai remarqué que s'il n'y a pas d'entrée dans jou_batiment avec idbat = 2 ou idbat = 3 ou idbat = 7, ces trois valeurs ne sont pas non plus reprises par la jointure externe. Mais toutes les autres valeurs bien par contre, même si elles ne sont pas présentes dans jou_batiment :/ je ne comprends pas trop... :s
Nibor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2008, 11h55   #2
Modérateur
 
Avatar de Cybher
 
Homme Michel
Consultant informatique
Inscription : mai 2005
Messages : 3 006
Détails du profil
Informations personnelles :
Nom : Homme Michel
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : mai 2005
Messages : 3 006
Points : 4 039
Points : 4 039
bonjour,

peux tu nous fournir un petit jeu d'essai qui nous permette de reproduire le problème? script de création des tables, quelques insertions, le résultat attendu et le résultat que tu observes
Cybher est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2008, 11h59   #3
Membre à l'essai
 
Inscription : septembre 2006
Messages : 60
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Belgique

Informations forums :
Inscription : septembre 2006
Messages : 60
Points : 23
Points : 23
Je viens de découvrir qqch:

J'ai trouvé quelles étaient ces valeurs qui sont absentes: ce sont celles qui sont présentes dans jou_batiment mais sous un autre idjou que $id.
Comment faire pour qu'elles soient quand-même prises dans la jointure?
Nibor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2008, 12h19   #4
Membre à l'essai
 
Inscription : septembre 2006
Messages : 60
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Belgique

Informations forums :
Inscription : septembre 2006
Messages : 60
Points : 23
Points : 23
ok.

Voici les 2 tables requises + la table principale vers où pointe l'index idjou:
Voici le script php:

J'espère qu'il echo-te toutes les valeurs de 1-61, suivi d'un nombre (en général 0). C'est ce qu'il fait, sauf qu'il oublie certaines valeurs (celles qui sont présentes chez d'autres 'idjou' dans la table jou_batiments)
Nibor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2008, 13h02   #5
Modérateur
 
Avatar de Cybher
 
Homme Michel
Consultant informatique
Inscription : mai 2005
Messages : 3 006
Détails du profil
Informations personnelles :
Nom : Homme Michel
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : mai 2005
Messages : 3 006
Points : 4 039
Points : 4 039
Citation:
Envoyé par Nibor Voir le message
Je viens de découvrir qqch:

J'ai trouvé quelles étaient ces valeurs qui sont absentes: ce sont celles qui sont présentes dans jou_batiment mais sous un autre idjou que $id.
Comment faire pour qu'elles soient quand-même prises dans la jointure?
je ne comprends pas la. si tu veux que même ceux qui ont un autre id que $id soit pris dans la jointure, pourquoi tu mets cette condition? suffit de l'enlever dans ce cas non?
Cybher est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2008, 13h11   #6
Membre à l'essai
 
Inscription : septembre 2006
Messages : 60
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Belgique

Informations forums :
Inscription : septembre 2006
Messages : 60
Points : 23
Points : 23
non, ce n'est pas cela que je veux dire. Si on l'enlève, il va mettre la somme de tout les nombres qu'il y a pour les autres id. Moi je veux qu'il mette 0 dans ce cas. Maintenant, il met rien du tout.

Mais en chipottant je viens de trouver la réponse, il fallait une jointure de plus:

Code :
1
2
3
4
5
6
7
8
SELECT d.idbat, idjou, IFNULL(envie, 0) AS envie, IFNULL((29/30*diff_objectif),0) AS diff_objectif, IFNULL(SUM(nombre),0) AS nombre, IFNULL(j.prix,0) AS prix 
FROM jou_batiments j 
	JOIN jou_infos i
		ON j.idjou = $id AND i.id = $id
	RIGHT OUTER JOIN def_batiments d 
		ON j.idbat = d.idbat 
WHERE idjou=$id OR j.idbat IS NULL 
GROUP BY idbat
Maintenant ca marche
Nibor 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 05h41.


 
 
 
 
Partenaires

Hébergement Web