PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 01-12-2010 14:27:26

Maximeus
Membre
Inscription : 08-06-2009
Messages : 20

Utilisation jointures

Bonjour,

J'ai un petit souci avec l'utilisation des jointures.

Lorsque je fais une requête pour afficher les données de ma db, la page n'affiche pas toujours le résultat en fonction des jointures que je place dans ma requête.

Voici comment est composée une partie de ma db:

La table AD avec les colonnes AD_ID, AD_CREATED, AD_UPDATED, AD_DELETED, AD_ACTICE

La table LOCATION_ADDRESS avec les colonnes LOCATION_ADDRESS_ID, AD_ID, LOCATION_ADDRESS_NUMBER, LOCATION_ADDRESS_STREET, LOCATION_LOCALITY_ID2, LOCATION_LOCALITY_ACTIVE

La table LOCATION_LOCALITY avec les colonnes LOCATION_LOCALITY_ID, LOCATION_LOCALITY, LOCATION_COUNTRY_ID, LOCATION_LOCALITY_ACTIVE

La table AD est la table de référence dont la colonne AD_ID est utilisée pour lier les autres tables (par exemple la table LOCATION_ADDRESS)

La table LOCATION_ADDRESS est liée à la table LOCATION_LOCALITY par la colonne LOCATION_LOCALITY_ID.

La table LOCATION_LOCALITY est liée à la table LOCATION_COUNTRY par la colonne LOCATION_COUNTRY_ID.

J'ai structuré ma requête comme suit:

SELECT * FROM ad
INNER JOIN location_address ON (ad.ad_id=location_address.ad_id)
INNER JOIN location_locality ON (location_address.location_locality_id=location_locality.location_locality_id)
INNER JOIN location_country ON (location_locality.location_country_id=location_country.location_country_id)
WHERE AD.AD_ID="'.$ad_id.'"

Malheureusement, il ne m'affiche pas toujours les résultats.

Je soupçonne les tables LOCATION_LOCALITY et LOCATION_COUNTRY de poser problème car elle ne sont pas liées directement à la table AD...

Avez-vous une idée comment je peux optimiser ma requête? Dois-je utiliser un RIGHT JOINT pour le table LOCATION_LOCALITY et LOCATION_COUNTRY?

Merci d'avance

Hors ligne

#2 01-12-2010 16:30:45

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Utilisation jointures

Saluton,
Avant d'aller au fond du problème, qqes remarques sur la forme.
SELECT *, à éviter autant que faire se peut.
Les parenthèses autour des paramètres du ON ne servent à rien.
AD.AD_ID étant probablement numérique les quotes autour de $ad_id sont très certainement contre-productives.
POur le reste je regarderai cela ce soir car là je n'ai pas le temps.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 02-12-2010 04:59:35

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Utilisation jointures

Après étude de ta requête et de ta description des tables j'ai deux remarques :
la table LOCATION_ADDRESS ne comporte pas de colonne  location_address.location_locality_id mais une colonne location_address.location_locality_id2
Donc la requête devrait tout simplement retourner un message d'erreur.
Tu nous fais intervenir une quatrième table LOCATION_COUNTRY qui n'est pas décrite.
S'agissant de l'utilisation de jointures internes ([INNER JOIN]) ou externes ([OUTER] LEFT|RIGHT JOIN) tout dépend de ce que tu veux privilégier dans le résultat du SELECT.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#4 02-12-2010 08:45:07

Maximeus
Membre
Inscription : 08-06-2009
Messages : 20

Re : Utilisation jointures

Bonjour Maljuna Kris,

Merci pour tes remarques.

Concernant la colonne location_address.location_locality_id2 s'est une erreur de ma part. Il s'agit en fait de location_address.location_locality_id qui est lié à location_locality.location_locality_id

Pour ce qui est de la table LOCATION_COUNTRY, elle contient les colonnes LOCATION_COUNTRY_ID, LOCATION_COUNTRY, LOCATION_COUNTRY_ACTIVE

Donc en bref:

ad.ad_id est lié à location_address.ad_id

location_address.location_locality_id est lié à location_locality.location_locality_id

location_locality.location_country_id est lié à location_country.location_country_id

Maintenant ma question est quelle jointure dois-je utiliser dans ce cas de figure ?

Salutations

Dernière modification par Maximeus (02-12-2010 08:47:24)

Hors ligne

#5 02-12-2010 09:32:24

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Utilisation jointures

heuuu, je peu faire une remarque ?? big_smile
a++

Hors ligne

#6 02-12-2010 10:10:30

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Utilisation jointures

Et ma réponse sera la  même : tout dépend de ce que tu veux précisément obtenir.
En d'autres termes, quelle VUE souhaites-tu représenter de ton système d'information.
J'imagine que Pierrot souhaite remarquer que répéter le nom entier de la table dans le nom de chaque colonne rend verbeuse et besogneuse la rédaction des requêtes.
Si telle était sa remarque sous-entendue, je partage complètement ce point de vue, mais peut-être n'es-tu pas l'auteur de ces structures.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#7 02-12-2010 11:07:14

Maximeus
Membre
Inscription : 08-06-2009
Messages : 20

Re : Utilisation jointures

Voilà comment ça se passe:

Lorsque que je souhaite ajouter une annonce, il enregistre une nouvelle entrée dans la table AD.

Je récupère l'identifiant qui est généré automatiquement dans la colonne AD.AD_ID

Cet identifiant je le récupère sous forme d'une valeur ($ad_id) et l'utilise pour créer un nouvel enregistrement dans le table LOCATION_ADDRESS qui correspondant à l'adresse de mon annonce. L'identifiant AD_ID est ajouté à la colonne LOCATION_ADDRESS.AD_ID pour permettre de faire le lien entre les deux tables.

Les tables LOCATION_LOCALITY et LOCATION_COUNTRY sont 2 tables qui contiennent la ville et le pays de l'annonce. Je n'effectue aucun enregistrement sur ces 2 tables mais récupère les valeurs pré enregistrées des colonnes LOCATION_LOCALITY.LOCATION_LOCALITY_ID et LOCATION_COUNTRY.LOCATION_COUNTRY_ID pour lier la table LOCATION_ADDRESSE à LOCATION_LOCALITY et lier la LOCATION_LOCALITY à LOCATION_COUNTRY.

Finalement, je souhaite afficher les données qui sont liées au dernier enregistrement effectué dans la table AD en utilisant la valeur $AD_ID

Pour ce faire, j'utilise le code suivant (désolé pour le SELECT * et autres caractères indésirables smile ):

"SELECT * FROM ad"
"INNER JOIN location_address ON (ad.ad_id=location_address.ad_id)"
"INNER JOIN location_locality ON (location_address.location_locality_id=location_locality.location_locality_id)"
"INNER JOIN location_country ON (location_locality.location_country_id=location_country.location_country_id)"
"WHERE AD.AD_ID="'.$ad_id.'""

Hors ligne

#8 02-12-2010 11:32:02

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Utilisation jointures

La requête sous-entend qu'il existe forcément au moins une liaison entre chacune des quatre tables, si l'une des liaisons fait défaut la requête sera vide.
Autrement dit, si la table LOCATION_ADDRESS n'a pas sa colonne LOCATION_LOCALITY_ID renseignée la jointure ne se fera pas vers la table de nomenclature LOCATION_LOCALITY, et donc l'ensemble du résultat sera vide.
Je suppose que la table de nomenclature LOCATION_LOCALITY ne comporte pas de lignes orphelines de lien vers la table de nomenclature LOCATION_COUNTRY.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#9 02-12-2010 11:51:20

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Utilisation jointures

MK->
tu lis dans mes pensées big_smile:D


LOCATION LOCATION LOCATION LOCATIONLOCATION LOCATION LOCATION LOCATIONLOCATION LOCATION LOCATION LOCATIONLOCATION LOCATION LOCATION LOCATIONLOCATION LOCATION LOCATION LOCATIONLOCATION LOCATION LOCATION LOCATIONLOCATION LOCATION LOCATION LOCATIONLOCATION LOCATION LOCATION LOCATIONLOCATION LOCATION LOCATION LOCATIONLOCATION LOCATION LOCATION LOCATIONLOCATION LOCATION LOCATION LOCATION



c'est la seule chose que j'ai retenue de la requête big_smile:D:D

à vouloir trop bien faire, on se retrouve avec un espèce de charabia quasi illisible


@+

Hors ligne

#10 02-12-2010 12:30:55

Maximeus
Membre
Inscription : 08-06-2009
Messages : 20

Re : Utilisation jointures

Maljuna Kris,

Il existe bien une liaison entre chaque table et j'ai vérifié, aucune ne fait défaut. La table LOCALITY_ADDRESS a bien une colonne LOCALITY_ID.

Le problème vient donc de ma requête et des jointures qui sont dedans...

Pour Pierrot: je préfèrerai que tu sois plus constructif. Heureusement que je n'ai indiqué que 4 tables sur 40, car tu sembles déjà complètement perdu wink

Salutations

Hors ligne

#11 02-12-2010 12:51:16

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Utilisation jointures

Maximeus a écrit :

Il existe bien une liaison entre chaque table et j'ai vérifié, aucune ne fait défaut. La table LOCALITY_ADDRESS a bien une colonne LOCALITY_ID.

Le problème vient donc de ma requête et des jointures qui sont dedans...

Ou de $ad_id qui est vide....

"SELECT les_noms_de_colonnes_qui_vont_bien
 FROM ad
 INNER JOIN location_address la
       ON ad.ad_id=la.ad_id
 INNER JOIN location_locality ll
       ON la.location_locality_id=ll.location_locality_id
 INNER JOIN location_country lc
       ON ll.location_country_id=lc.location_country_id
 WHERE ad.ad_id=$ad_id"

As-tu testé la requête directement dans PHPMyAdmin ?


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#12 02-12-2010 15:01:04

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Utilisation jointures

>>Pour Pierrot: je préférerai que tu sois plus constructif.

Nous somme d'accord, c'est bien un problème de construction wink

>>Heureusement que je n'ai indiqué que 4 tables sur 40, car tu sembles déjà complètement perdu.

Pour ce qui est de la longueur de la quéquète, je suis gagnant big_smile:D
Si je suis perdu dans ta structure, c'est tout simplement qu'elle est mal faite wink

a++

Hors ligne

#13 10-01-2011 16:30:14

Maximeus
Membre
Inscription : 08-06-2009
Messages : 20

Re : Utilisation jointures

Salut,

Désolé pour mon post tardif.

Comme j'ai trouvé la solution, je tenais à la partager avec vous.

Le problème venait de mes tables. Chaque table de ma db a une colonne avec un identifiant. J'avais bêtement oublié d'indexer ces colonnes (Primaire ou Index).

Encore merci pour votre aide.

A bientôt.

Dernière modification par Maximeus (10-01-2011 16:30:22)

Hors ligne

#14 10-01-2011 22:11:32

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Utilisation jointures

big_smile:D
























































j'ai rien dis big_smile
a++

Hors ligne

#15 10-01-2011 22:36:19

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Utilisation jointures

@Pierrot : mais quel assourdissant silence !


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#16 10-01-2011 22:43:22

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Utilisation jointures

chuuuuuuuuuuuuttttt !!!!!!!!!!! big_smile
a++

Hors ligne

Pied de page des forums