Page 1 sur 1

Modification de jointure problématique

Posté : 11 mai 2006, 10:31
par didgar
Salut !

Voilà l'histoire :

2 tables [pour simplifier]

La table rubrique
id_rub - titre_rub
1 - rubrique_a
2 - rubrique_b

etc ...

La table produit ( ancienne formule )
id_bp - id_rubrique - nom
1 - 1 - a
2 - 1 - b
3 - 2 - c

Quand je voulais récupérer en une seule fois les noms des produits et le titre de la rubrique associée, pour une rubrique donnée :

Code : Tout sélectionner

SELECT pr.nom, rub.titre_rub FROM produit pr INNER JOIN rubrique rub ON rub.id_rub = pr.id_rubrique WHERE pr.id_rubrique='".$id_search."'
et ça marchait très bien ;-)

Le problème, c'est qu'aujourd'hui un produit peut être affecté à plusieurs rubriques donc le stockage change :

La table produit ( nouvelle formule )
id_bp - id_rubrique - nom
1 - |1| - a
2 - |1|3| - b
3 - |1|2|7| - c
4 - |2|27|70| - d

Et maintenant je suis dans la daube ;-)

J'ai essayé sans succès :

Code : Tout sélectionner

SELECT pr.nom, rub.titre_rub FROM produit pr INNER JOIN rubrique rub ON CONCAT('|',rub.id_rub,'|') LIKE pr.id_rubrique WHERE pr.id_rubrique LIKE '%|".$id_search."|%'
Le pb se situe au niveau de la jointure !
Dans la table produit sera récupéré l'enregistrement ayant |6| comme id_rubrique mais pas celui qui a |1|6|12|

Si quelqu'un a une idée !

Merci d'avance.

Didier

Re: Modification de jointure problématique

Posté : 11 mai 2006, 11:18
par ouckileou
Si quelqu'un a une idée !
J'en ai une oui :
modélise correctement ta base

Quand 1 produit peut être affecté à 1 ou plusieurs rubriques, il faut une jointure

On ne stocke pas plusieurs valeurs dans une même colonne

donc tu enlèves la colonne "id_rubrique" de ta table colonne

et tu fais une table du genre "appartient_a" comme ça :
id_rubrique | id_produit

chaque ligne de cette table fera le lien entre un produit et une rubrique

C'est typiquement le genre de problème qui arrive quand on ne modélise pas sa table correctement en suivant les règles.
Fais donc une petite recherche sur Merise ;)

Re: Modification de jointure problématique

Posté : 11 mai 2006, 11:35
par didgar
Si quelqu'un a une idée !
J'en ai une oui :
modélise correctement ta base

Quand 1 produit peut être affecté à 1 ou plusieurs rubriques, il faut une jointure

On ne stocke pas plusieurs valeurs dans une même colonne .../...

.../... C'est typiquement le genre de problème qui arrive quand on ne modélise pas sa table correctement en suivant les règles.
Fais donc une petite recherche sur Merise ;)
Salut !

Hi hi ! J'étais sur d'avoir une réponse dans le genre ;-)

Ma modélisation était bonne jusqu'à ce que les instances supérieures changent d'avis ... ce qui est très fréquent :roll:

Je compte bien revoir ma modélisation à un moment ou à un autre mais la ça urge et une rustine me serait très utile.

A+

Didier

Posté : 11 mai 2006, 11:44
par ouckileou
Ben c'est normal c'est la seule réponse que tu peux avoir

Ta modélisation était bonne pour le cas précédent effectivement, mais elle ne l'est plus, donc faut la changer :lol:. C'est vrai c'est chiant si c'est pas toi qui l'a décidé mais bon...

Franchement, tu peux bien faire un truc avec des traitements de chaînes et tout, mais ce sera un vrai bordel et je ne crois pas une seule seconde que tu le changeras après... parceque t'auras pas le temps, d'autres trucs à faire plkus urgents, pas envie ou encore parceque ce sera devenu tellement compliqué que personne voudra y toucher.

En plus, ça me parait pas si compliqué :
1 - tu crées la table de liaison
2 - tu fais une requête qui va récupérer l'id de chaque produit, les différents ID de rubriques de ce produit, et pour chacun de ces derniers faire un INSERT dans la jointure
3 - tu supprimes ta colonne id_rubrique initiale

Je suis sûr que faire ça te prendre autant de temps que de faire une bidouille, une "rustine" ;)

Alors qu'avec ça, ta base est correctement faite, facilement utilisable, et tu t'évites bien des problèmes futurs

Posté : 11 mai 2006, 12:18
par didgar
:? j'ai bien peur que tu sois dans le vrai :lol:

A+

Didier