1

Salut a tous.
J'essaie d'écrire un script pour générer automatique mes requêtes en m'aidant du modèle relationnel qui lie les différentes entités. je me sert du :

SELECT * FROM(LEFT JOIN ... ON(...) LEFT JOIN ... ) pour joindre mes entités.


Mon problème se situe au niveau du fait que j'utilise * et que j'ai une double référence sur une table dans mon LEFT JOIN. J'ai donc utilisé un ALIAS pour la seconde référence à ma table. Je m'attend donc a ce que le code joigne les enregistrements de ma table et de son ALIAS en un seul enregistrement, mais la c'est la grande déception.




Voici mon pseudo code :

La table relation contient une double référence sur la table entity

TABLE relation( id_relation , idEntity_relation , idEntity_relation2)

TABLE entity( id_entity , property1 , property2 )


Avec Cette requête je voudrais obtenir que chaque enregistrement contienne tous les attributs des 2 entity de chaque enregistrement de la Table relation

SELECT * FROM (((relation LEFT JOIN entity ON( relation.idEntity_relation=entity.id_entity )) LEFT JOIN entity entity2 ON( relation.idEntity2_relation=entity2.id_entity ))


J'aurai penser que le fait d'utiliser l'alias MySql aurait compris qu'il fallait l'appliquer à tout les attributs de l'alias 'entity2'.
Mais non ca le fait unique pour la clé primaire, les autres attributs écrasant peut-être ceux de la 1ère Table entity.

Je suppose que c'est trop demander a l'option * de faire son boulot correctement et que je doive manuellement donner les noms des champs alors que je les veux tous.


Si vous pouvez me confirmer cela, ca serait sympa je fait mes début en MySql donc je connait pas trop les astuces.

2

Bah alors les copains, je sais que y en a qui font du Web-Développement parmi les aficionado de TI et des jeux, pour m'aider.

Parce que la, je vais être dans l'obligation de préciser la liste des champs après le SELECT plutôt que d'utiliser *.

Ce qui ne me semble pas très pratique.

3

andoh_wilfried (./1) :
Je suppose que c'est trop demander a l'option * de faire son boulot correctement et que je doive manuellement donner les noms des champs alors que je les veux tous.
andoh_wilfried (./2) :
Parce que la, je vais être dans l'obligation de préciser la liste des champs après le SELECT plutôt que d'utiliser *.

Retiens d'abord une chose: utiliser le * c'est le mal. Il vaut [toujours] mieux préciser tes champs à la main.
- prout -
Retiens ensuite que tu peux faire une jointure sans utiliser de mot-clef "JOIN", et que la plupart du temps MySQL est sufisamment malin pour l'optimiser autrement si c'est nécéssaire.
"SELECT * FROM relation AS r, entity AS e1, entity AS e2 WHERE r.idEntity_relation = e1.id_entity AND r.idEntity2_relation=e2.id_entity;"
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

4

Merci Golden pour les conseils.

Si j'ai bien compris le LEFT JOIN me pose systématiquement problème quand j'utilise des ALIAS, vu que y a pas de risque de nom d'attribut identique pour des entités différentes à cause de la façon dont je les ai nommé(nomattribut_nomtable).


Je t'expose mon problème de façon plus général :

Les entités que je manipule le plus provienne d'un modèle objet dans lequel il sont pour la plus part fils, petit-fils sinon plus.

les requetes LEFT JOIN fonctionne à merveille, mais vu que tu me dit que c'est pas l'idéal( vitesse ).

voici un exemple de requête qui me permet d'extraire un objet bknews fils de book et au passage ramène toutes les infos sur l'utilisateur ayant créer ce bknews :

SELECT * FROM (((((bknews LEFT JOIN book ON( bknews.idBook_bknews=book.id_book )) LEFT JOIN user ON( book.idUser_book=user.id_user )) LEFT JOIN usergrouplist ON( user.idUsergrouplist_user=usergrouplist.id_usergrouplist )) LEFT JOIN userrolelist ON( user.idUserrolelist_user=userrolelist.id_userrolelist )) LEFT JOIN usercategorylist ON( user.idUsercategorylist_user=usercategorylist.id_usercategorylist )) LEFT JOIN icone ON( book.idIcone_book=icone.id_icone ) LIMIT 0, 6


Je pense que je dois pouvoir adapté mon code en utilisant un SELECT comme tu l'as fait pour récupérer mes objets. J'avais pas bien pigé le LEFT JOIN alors.

Merci



5

au fait Golden :

"SELECT * FROM relation AS r, entity AS e1, entity AS e2 WHERE r.idEntity_relation = e1.id_entity r.idEntity2_relation=e2.id_entity;"


Je suppose que c'est pas soucis de simplification que tu as écrit les conditions du WHERE sans les AND

6

Heu non c'est parce que je suis étourdi.
Mais en fait pour le reste j'ai fumé, je confonds tj le left join avec un autre truc sorry
En fait ça fera peut être pas ce que tu veux sans le "left join"… Mais comme tu as pas bien précisé j'en sais rien.
Sinon ça doit marcher en mettant un alias à toutes tes tables tongue
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

7

En effet ca marche pas, je viens de tester en modifiant mon code pour générer la requête comme tu avais dit.

Je vais renommer systématiquement les tables ayant des doublon et tester ca de suite.

8

Cool Golden Crystal, ça marche nickel, j'ai modifier manuellement la requête pour tester dans PhpAdmin.

La seule inquiétude que j'ai concerne le fait que les attributs de la Table a double référence portent les mêmes nom dans le view de PhpAdmin.
Je vais tiré ca au clair en exécutant la requête à partir d'un code Php.


Donc si une table est utilisée plusieurs fois dans une JOIN(LEFT en l'occurrence dans notre cas), il faut utiliser un ALIAS partout en lieu et place de la Table et ne pas faire comme moi ( ne pas utiliser un ALIAS pour la 1ere occurrence de la Table).


Je peut me remettre au code, car je dois détecter à l'avance les tables ayant des références multiples dans ma requêtes.


Merci Golden.

9

alors faut croire que mon code de requête était correct depuis le tout debut.
La ou j'avais merder c'était dans une classe PHP( que j'avais écrite y a des lustres) et qui j'utilisais systématiquement mysql_fetch_assoc pour recuperer les données.
Ce qui est strictement déconseillé quand on fait joujou avec les ALIAS.

J'ai donc réécrit un autre mysql_fetch_assoc (qui rajoute un index numérique de façon automatique aux ALIAS) en utilisant mysql_fetch_field et mysql_result.

10

Thanks for you information i newly join and your post help me.

11

12

Alors là, tu pouvais difficilement te planter davantage de topic grin

Il vaut mieux que tu poses ta question ici : forums/7 (et crées un nouveau sujet, au lieu de répondre dans un déjà existant qui n'aura pas forcément de rapport)
avatarAll right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

13

Non mais heu c'est un bot ou un humain programmé comme un bot (donc un bot)... Il faudrait plutôt le bannir... (zyeute son post précédent et sa signature ^^)
Je crois que leur nouvelles stratégies ça doit être de repomper des vrais texte et de les reposter un peu partout à moitié au hasard (Je pense avoir déjà lu ce post là (l'original) sur yN...)
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

14

Oui, je m'en suis rendu compte avec un deuxième post... j'ai l'habitude de lire yAronet en passant par "mes sujets", et on ne voit pas les signatures dessus.
avatarAll right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)