JOINTURE pas obliger

xactise Messages postés 507 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 22 juin 2012 - 8 déc. 2010 à 11:10
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 9 déc. 2010 à 18:43
Bonjour à tous !

Petite question je vous expose la situation !

j'ai 4 objet différent qui ont 4 table différent avec des champs parfois identique parfois non.

C'est 4 objet, ont 1 point commun qui est un ID unique.

je souhaiterai faire une jointure sur ces 4 table (sachant qu'une seul d'entre elle correspondera a l'ID unique) donc j'utilise un LEFT JOIN, mais le problème c'est qu'il me selectionne * sur chaque table, même sur celle qui n'ont pas été jointe, du coup je me retrouve avec des champs NULL car la jointure n'a pas été faire et qui peuvent pour certain porter le même nom de champs que d'autre ou la jointure à réussi.

je sais pas si je me suis bien faire comprendre. voici ma requête :

SELECT *
FROM `ps_bureauvirtuel` AS bv
LEFT JOIN `ps_ressource_importation` AS ri ON ri.id_bv = bv.id_bureauvirtuel
LEFT JOIN `ps_ressource_importation_lang` AS ril ON ril.id_ressource_importation = ri.id_ressource_importation
AND ril.id_lang =2
LEFT JOIN `ps_testexercice` AS te ON te.id_bv = bv.id_bureauvirtuel
LEFT JOIN `ps_testexercice_lang` AS tel ON tel.id_testexercice = te.id_testexercice
AND tel.id_lang =2
WHERE bv.id_bureauvirtuel =118
LIMIT 0 , 30 


pour reprendre le contexte, j'ai donc 4 objet qui correspondent a des "ressources" une ressource importation qui correspond a un outil qui permet de joindre un fichier quelquonque, et un autre par exemple textexercice qui permet de creer des quiz.

c'est différent objet ressource, sont regroupé dans un bureau virtuel c'est l'ID qui les identifie.

D'avance merci,



L0rD...

15 réponses

syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
8 déc. 2010 à 12:45
Euhh.. j'ai pas tout saisi. Tes NULL sont normaux, il faut bien mettre des données (même NULL) dans tes cases non ??
S.
0
xactise Messages postés 507 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 22 juin 2012 2
8 déc. 2010 à 13:56
Bonjour et merci à toi !

Oui mes NULL sont "normaux" dans le sens ou en utilisant LEFT JOIN, même si la jointure n'est pas possible, il va selectionner les champs et mettre les value à NULL.

Ce que je souhaite c'est si il n'arrive pas a faire la jointure, il ne selectionne pas les champs.

J'ai plusieurs table à "comparer" je dirai dans le sens ou je doit les joindre à la requete, mais une seule d'entres elles, retournera un seul résultat, donc je veux éviter la selection des champs inutile (qui en plus pour certain, se nomme pareil) dans les jointures qui n'ont rien trouvé !

J'ai refait plusieur fois le tour de la question concernant la structure de la BDD, générallement quand on galère a joindre ces tables et a obtenir ce que l'ont veux c'est que la BDD à mal était pensé, mais après avoir refait le tour plusieurs fois je ne voit pas ce qui cloche, je me dit qu'une jointure de ce type doit exister, j'ai beau chercher je ne la trouve pas et dieu sais qu'il en existe de nombreuse de jointure ^^

D'avance merci,


L0rD...
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
8 déc. 2010 à 18:53
Salut,

Dans une base de données correctement modélisée, on n'utilise JAMAIS le même nom pour des données différentes.
Comme si tu ne créais que des fichiers index.php partout, y'a un moment, faut pas s'étonner de s'y perdre.

Si tu fais SELECT * , faut pas t'étonner de récupérer tous les champs, même ceux dont tu n'as pas besoin.
Je ne vois pas où est vraiment le problème, si ce n'est dans le code (qu'on ne voit pas) ou dans la modélisation de la base (dont tu ne nous dis rien non plus).

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
xactise Messages postés 507 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 22 juin 2012 2
9 déc. 2010 à 08:16
Bonjour neigedhier et merci pour ta participation qu'on sens toujours passer ^^

pour en revenir a ce que tu disais :

-
Dans une base de données correctement modélisée, on n'utilise JAMAIS le même nom pour des données différentes.

Dans une BDD on utilise JAMAIS 2 fois le même nom de champs ??? heuuu je ne connaissait pas spécialement ce point ! mais c'est pas évident avec une Base de plus de 150 table. pour les rares exeption il y a les "as".

Comme si tu ne créais que des fichiers index.php partout, y'a un moment, faut pas s'étonner de s'y perdre.


Je ne voit pas vraiment le lien, en quoi on se perd d'avoir 30 fichier index.php dans des dossier différents ? dans le cas d'une BDD en cas de jointure jveux bien l'entendre en cas de jointure, mais le rapport avec le fichier index.php je suis moin fan ^^


Si tu fais SELECT * , faut pas t'étonner de récupérer tous les champs, même ceux dont tu n'as pas besoin.


JE ne m'étonne pas justement je le dit, qu'en utilisant un LEFT JOIN, même en ne trouvant pas de correspondance il retourne les résultat, hors moi je veux que s'il ne trouve pas de résultat il retourne rien, mais sans forcement stopper la requete avec un JOIN par exemple.


Je ne vois pas où est vraiment le problème, si ce n'est dans le code (qu'on ne voit pas) ou dans la modélisation de la base (dont tu ne nous dis rien non plus).


A croire que plus j'écrit de chose, moin je me fait comprendre ! le problème neut vien pas du coup d'ou le fait qu'il y en es pas... par contre je suis d'accord avec toi je le dit même plus haut, le problème vien certainement de la modélisation, mais après avoir fait plusieurs fois le tour je ne voit pas je me dit qu'une méthode SQL doit exister pour arrive a mes fins.


Cependant je vais ré-expliquer mais cette fois si côté modélisation de la BDD.

J'ai plusieur objet ! Exemple : des objet "importation de fichier" des objet "creation de document à la volée" (avec un éditeur WYSIWYG), etc...

c'est objet sont regrouper dans une sorte de bureau virtuel (des dossier, public ou privée, avec une récursive).

Ensuite je doit créer un cours ! dans ce cours je vais allez chercher plusieurs de mes objets qui sont stocker dans mon bureau virtuel.
Première étape du cour, je vais prendre mon document à la volée.
Deuxième étape du cour, je vais prendre mon fichier importer.

Comme ce sont 4 objet différent il n'ont pas d'ID en commun (c'est la que sa coince, je pense, mais pas sur j'y reviendrai)

Le problème qui va se poser c'est que en BDD je vais dire l'étape 0 du cours correspond a l'ID 8 mais de quel objet ? ID 8 d'un fichier importation ou ID 8 d'un fichier créer a la volée, ou autre encore...

Il est la mon problème.

Comme mes différentes objets (quiz, fichier importer, fichier créer, etc...) n'ont pas vraiment de point commun au niveau des donnée. ce sont 4 objet différent !

donc apres en cas de jointure sa coince !

Voila j'espère avoir était clair !

D'avance merci,

PS : dsl pour les fautes chui en retard, je ne me suis pas relu :)

L0rD...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 déc. 2010 à 08:44
Salut,

Désolé, je prends toujours un malin plaisir à bourrer mes réponses de cynisme ^^ Merci de l'avoir bien pris :p

Bon, moi, très sincèrement, je ne comprends toujours pas ton problème : je veux dire que je ne comprends rien, en fait. Je ne comprends toujours pas à quoi ressemble ta base de données, je ne comprends pas ce que tu obtiens, ce que tu aimerais obtenir, etc.
Est-ce que tu accepterais de détailler un peu plus ta bdd ?
Par exemple, en faisant un petit schéma des tables incriminées, en faisant un petit tableau avec les lignes que tu obtiens en expliquant celles que tu ne veux pas, ... Parce que vraiment, là, moi je pige rien à ce que tu décris ^^ (sans vouloir t'offenser ;) )

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 déc. 2010 à 08:47
En fait le problème dans l'histoire, c'est que tu fais systématiquement le parallèle avec ton code PHP, alors qu'en ralité, on s'en fiche pas mal : on n'a pas besoin de ça pour faire fonctionner une requête : au contraire, ça embrouille plus qu'autre chose (en ce qui me concerne, du moins)

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
xactise Messages postés 507 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 22 juin 2012 2
9 déc. 2010 à 08:53
Il n'y a absolument aucun code PHP dans toute cette histoire :)

J'expliquerai dans le détail ma BDD avec un shémas dès que je peux, car j'ai vraiment besoin de votre aide sur ce coup.

D'avance merci à tous, à tout a l'heure !

je vous fait sa dans la journée dès que j'ai un bout de temps !

L0rD...
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
9 déc. 2010 à 10:05
C'est bête mais quel résultat veux tu obtenir ?
Je ne parle pas de mot, de description mais si on pars du principe que ton résultat est 'nécessairement' sous la forme d'un tableau, d'une matrice 2x2. A quoi peut ressembler le tableau final que tu désires ? Le point qui m'intéresse est de savoir ce que tu vas 'mettre' dans ce tableau pour les valeurs qui selon toi n'existent pas.
Suis je clair ? C'est bête mais c'est plus facile sur papier.. LOL..
S.
0
xactise Messages postés 507 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 22 juin 2012 2
9 déc. 2010 à 14:55
Re tous le monde est encore merci de suivre ce post.

Pour vous aider a comprendre, ou pour m'aider a m'exprimer ^^

j'ai fait un schémas de la BDD de la parti qui nous intérèsse !

voir le screen ci joint



donc en gros nous avons un bureau virtuel qui concrètement sont des dossiers, 1 dossier appartien a 1 employé, il y a une recursive (id_parent) est ce que le dossier est public ou prive !
ensuite nous avons sa jointure pour la lang nom du dossier et description du dossier

2 tables de ressources - Importation de fichier et création de document via editeur WYSIWYG - (il y en a plus, mais c'est pour l'exemple) avec leur jointure de lang associés.

Et ces ressource sont donc join égallement a une table ressource et c'est la que sa coince, avec un type pour savoir de quelle table il sagit (ne pouvant pas mettre tous les type de ressource dans une même table car comme vous pouvez le constater, la ressource importation de fichier n'a pas besoin des même champs que la ressource document).

et cette ressource est donc dans un des dossiers de mon bureau virtuel.

quand je vais créer un cours par la suite, je vais y insérér des ressource.

par la suite je vais avoir besoin de récupéré ces informations dont est composer mon cours !

et j'aurai voulu le faire en une seul requête le souci c'est que la ce n'est pas possible car il y a un champs "type" dans la table ressource qui me dit dans quelle table je doit taper.

Je pense qu'il y a un souci au niveau de la BDD dans les différent type de ressource et leur donnée, et les RESSOURCES (l'ensemble de ts les type de ressource) mais je ne voit pas comment faire.

D'avance merci !


L0rD...
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
9 déc. 2010 à 15:11
Je suis sur que ton projet est intéressant, mais aucun de nous n'arrive à comprendre.. LOL..
il y a un champs "type" dans la table ressource qui me dit dans quelle table je doit taper

Perso je trouve ça maladroit, mais bon, c'est mon avis. Pas de grosse bêtise en vue.. Mais puisque les tables n'ont pas les mêmes colonnes, qu'est qui te gène de vouloir faire UNE seule requete ?
Fais-en plusieurs et gère les résultats en PHP pour en faire le résultat que tu désires au final.. Tu vois bien ?? le fameux tableau que je t'ai demandé au message au dessus.. LOL !!
S.
0
xactise Messages postés 507 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 22 juin 2012 2
9 déc. 2010 à 15:29
Merci syndrael,

cependant plutôt que de répété ce que je dit déjà, c'est à dire que je veux bien croire qu'il y a un problème dans la conception de la BDD aide moi a trouver une solution :)

Sa me gène de devoir arrêter mes jointure, et faire sa en 2 requête tout simplement je sais bien que PHP pourrait m'aider.

Sinon cocernant ton post précédent a savoir qu'est ce que j'attend comme résultat voici la réponse

avec donc la modélisation actuel voici le genre de requête que je pourrai avoir besoin

(je présise, aussi même si elle n'ont pas été modéliser, j'ai une table "cours" et "cours_organisation" ou pour chaque étape de mon cours, je vais chercher une ressource

SELECT * 
FROM `cours` AS c 
LEFT JOIN `cours_organisation` as co ON co.id_cours = c.id_cours 
LEFT JOIN `ressource` as r ON r.id_ressource = co.id_ressource 

LEFT JOIN `ressource_importation` AS ri ON ri.id_ressource = r.id_ressource
LEFT JOIN `ressource_importation_lang` AS ril ON ril.id_ressource_importation ri.id_ressource_importation AND ril.id_lang2

LEFT JOIN `ressource_document` AS rd ON rd.id_ressource = r.id_ressource
LEFT JOIN `ressource_document_lang` AS rdl ON rdl.id_ressource_document rd.id_ressource_document AND tel.id_lang2

WHERE c.id_cours = 1


Voila qu'est ce que je cherche a faire avec sa ?

J'ai un cours donnée je veux savoir les différentes étapes et ressource qui le composent.

donc je commence par cibler la table "cours"
ensuite je passe a "cours_organisation" pour connaitre les différentes étapes que compose mon cours.
Pour chaque étape il y a une ressource
je vais donc taper la table "ressource" afin de savoir qu'elle est la resssource associé a l'étape.

A l'heure actuel la solution est d'arrêter la requete ici pour savoir a quelle table cibler en fonction du "type_ressource" de la table ressource.

j'aurai voulu savoir si il est possible de continuer les jointure toujours en SQL

afin d'allez chercher les informations de la ressource correspondante.

ce que je souhaiterai dans cette exemple la :

si on continu la jointure comme je l'ai fé ci dessus.
je voudrai qu'il "test" la jointure sur la table "ressource_importation" si la jointure s'éffectue il importe les champs,

sinon il passe a la jointure suivante

pour ainsi me retrouve avec un tableau de donnée suivant :

cours.*
cours_organisation.*
ressource.*
et ici
soit ressource_importation.*
soit ressource_document.*

voila

plus j'y pense et plus je me dit qu'en faite ce que je cherche a faire est premièrement pas réalisable ! et surtout 2èment complètement inutile

l'intéruption de la reqûete est obligatoire je pense et n'aura pas de conséquence.

je croi bien m'avoir embrouiller tout seul je croi ^^

je vous laisse juger.

L0rD...
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
9 déc. 2010 à 15:37
j'aurai voulu savoir si il est possible de continuer les jointure toujours en SQL

Ma réponse est non.. pas possible.. LOL !!
cours.*
cours_organisation.*
ressource.*
et ici
soit ressource_importation.*
soit ressource_document.*

Le voila le tableau !! Donc RE-pas possible !!
Ma question est: pourquoi tu t'acharnes ainsi ? Ca me fait sourire car je suis sur que tu es plein de bonne volonté, mais apprends à segmenter les choses. Que se passe-t-il si tu rajoutes un jour une autre table ? Ou si tu as plein de lignes qui font mouliner ton serveur sur des jointures gourmandes en ressources et de surcroit inutiles, puisque tu n'exploiterais pas les résultats ??
S.
0
xactise Messages postés 507 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 22 juin 2012 2
9 déc. 2010 à 15:45
Ben c'est juste que simplement pas possible. enfin je pense.

sinon le jour ou je rajoute une autre table sa n'aurai rien changer (dans mes rêves...) vu que ce que je souhaite c'est qu'il selectionne les champs uniquement des table qu'il a su joindre.

mais ce n'est apparement pas possible;


L0rD...
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
9 déc. 2010 à 16:08
dans mes rêves...

Mon quart de siècle d'informatique m'a appris pas mal de choses, en voici 11 (je compte en binaire moi !!):
1. l'ordinateur est fondamentalement bête, il le sera moins quand il aura appris l'esprit de survie
2. c'est beau les rêves.. LOL !!
3. tu peux faire rentrer un rond dans un carré.. mais il faut taper très fort (dédicace à mon bout de chou 'bricoleur')
Donc à moins de casser ton schéma de base, et de te lancer dans de la donnée sérialisée pour les données spécifiques (il faut un bon marteau), ben tu peux oublier tes jointures. Rappelle toi qu'elles t'ont appris les choses possibles ou pas possible, et que tu en retires quelque chose intellectuellement parlant.
S.
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 déc. 2010 à 18:43
Une jointure sert à rappatrier une donnée d'une table lié à une autre d'après un champ commun.
On ne PEUT PAS rappatrier 2 tables sur une en cherchant à "mixer" les deux... Point. Qu'elles aient ou non les mêmes champs, etc... Ce sont des données différentes. Deux tables représentent des objets intrinsèquement différents (sinon on les modéliserait avec une seule table). Ca n'a donc tout simplement aucun sens de chercher à les joindre juste pour s'économiser une requête.

Personnellement, je ne comprends toujours pas ce que tu veux faire exactement. Je ne peux donc pas vraiment te dire quoi faire sur ton schéma pour que ça soit moins bancal (parce que je suis sûr qu'il l'est, sans vouloir t'offenser).
Je pense que tu n'as tout simplement pas passé suffisament de temps sur l'étape "analyse" et modélisation de la base de données. C'est bête, parce que c'est la seule étape sur laquelle on ne DOIT PAS sacrifier de temps, puisque d'elle dépendent TOUTES les étapes suivantes (y compris l'écriture de code).

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
Rejoignez-nous