|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 15 ![]() |
Bonjour,
J'ai cherché toute la journée sans résultat. Je cherche à faire un select sur 2 tables (jusqu'à là rien de dramatique) mais où la deuxième n'est pas statique. J'ai testé de faire une requête comme ça : Code :
SELECT * FROM tableA, CASE WHEN tableA.code = 'CODEA' THEN tableB ... Donc je ne vois plus comment faire, à par passer par un programme. Avez-vous une idée ? Merci. |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
non tu peux pas:
un truc simple: procédure stockée, tu sépares tes 2 requêtes si tu peux ton case en tant qu'instruction et tes différentes versions de requêtes après chaque then mais bon, comme ton exemple est pas très clair sur les liens entre les 2 tables... dur d'en dire plus
|
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 15 ![]() |
En fait j'ai une table pour les objets (avec les infos sur l'objet : son type, id, lieu ...) et plusieurs tables pour les différents types d'objet avec les infos de base (chaque type "A" a 10 caractéristique, chaque type B en a 5 ...).
Et je voudrais pouvoir lancer une requête qui me retourne les infos de chaque objet et de son type. Le type et représenté par 2 lettres et un numéro. Pour le moment je fais plusieurs requêtes, une pour avoir la liste des objets et une par objet pour avoir les infos de base. Ça démultiplie les requêtes et ça m'embête parce qu'il y a pas mal d'objet retourné, beaucoup d'utilisateur et beaucoup d'utilisation de cette requête. Je ne vois pas trop comment faire des requêtes dans une procédure stockée et de retourner les données. J'ai tenté de me débrouiller avec les procédures stockées avant de poster, mais je n'ai pas réussi a faire ce que je voulais. |
|
|
00
|
|
|
#4 | ||
![]() ![]() |
Pourquoi ne pas faire des vues qui réuniraient les caractéristiques de base de l'objet et celles de son type.
Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#5 | ||
|
Invité de passage
![]() Inscription : février 2008 Messages : 15 ![]() |
ça revient au même non ?
Disons que j'ai deux objets un de type "A" et l'autre de type "B". Ta vues ne m'avance pas plus que un simple Code :
Mon grand problème c'est que je ne sais pas par avance dans quelle table chercher (j'en ai 5 pour les types). Voilà un exemple du cheminement (simplifié) que j'utilise pour le moment. Code :
SELECT type_base FROM objet WHERE id = un nombre où RC = table construction et 5 = id dans cette table Code :
SELECT * FROM construction WHERE id = 5 |
||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
Avez vous pensé a utiliser du SQL Dynamique ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac) |
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
chaque objet a des caractéristiques différentes, pourquoi ne pas faire 3 tables:
une table objet, une table listant les caractéristiques possibles, et une table de liaison liant les caractéristiques et leur valeurs aux objets? |
|
|
00
|
|
|
#8 | |||
|
Invité de passage
![]() Inscription : février 2008 Messages : 15 ![]() |
Ok j'ai testé quelque chose ^^
j'ai une fonction "retourtable(code)" qui retourne la table par rapport à "code". Là pas de problème. Mais en utilisant une requête dynamique je n'arrive pas à l'appeler. Code :
Citation:
|
|||
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
c'est normal, mysql ne permet pas de préparer une requête à partir du résultat d'une fonction directement
tu dois stocké ça dans une variable globale avant: Code sql :
|
||
|
|
00
|
|
|
#10 | ||
|
Invité de passage
![]() Inscription : février 2008 Messages : 15 ![]() |
Bon voilà :
Code :
Comment faire pour plusieurs ? On y est presque |
||
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
qu'est ce qui ne marche pas pour les autres?
|
|
|
00
|
|
|
#12 | ||
|
Invité de passage
![]() Inscription : février 2008 Messages : 15 ![]() |
Code :
|
||
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
si tu veux parcourir toutes les valeurs faut faire une procédure stockée dans la quelle il y a un curseur et une boucle de lecture qui exécutera ta requête préparée sur chaque valeur renvoyée par le curseur.
|
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 15 ![]() |
Ok, mais comment tu renvois les données ?
Avec une variable ? Il me semble que les tableaux ne marche pas avec Mysql. Le curseur j'y ai pensé mais c'est le retour qui m'a toujours posé des problèmes et toutes les expériences que j'ai fait n'ont pas marché |
|
|
00
|
|
|
#15 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
ça dépend de tes besoins...
les paramètres peuvent être en in, out ou inout donc tu peux passer par des variable normales... tu peux aussi utiliser des variables globales à ta session quand tu veux transmettre facilement certaines valeurs entre différentes procédures, imbriquées ou non les tableaux peuvent être simulés en concaténant les valeurs en une chaines de caractères avec un séparateur quelconque... |
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 15 ![]() |
Mon but est de récupérer toutes les données avec php.
Donc au pire si il n'y à pas d'autre solution je peux utiliser une chaine de caractères. Mais il n'y a pas de moyen pour renvoyer les données sous la même forme qu'une requête classique, Pour que ce soit sur plusieurs ligne (plusieurs résultat)? Il n'y a pas de contrôleur de sortie pour renvoyer les données manuellement ? |
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
soit tu fais un select à chaque fois mais tu vas bufferiser beaucoup de choses et tu vas avoir un résultat moins optimisé que de concaténer dans un type text par exemple et d'exploser la chaine grâce aux fonctions de php en un tableau directement...
après faut voir que tu vas peut-être arriver à faire une super requête qui y arrive mais faut voir l'augmentation de complexité et de difficulté de maintenance ainsi que forcément la perte de rapidité de traitement... ça dépend de nombre de données que tu brasses donc au final |
|
|
00
|
|
|
#18 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 15 ![]() |
Ok encore une dernière question.
Niveau performance justement, que pensez-vous être le plus rapide. Utiliser mon code ci-dessus en concaténant le tout dans une chaine (tout les objets plus les info pour le type) Faire une requête pour avoir tout les objets puis avec php créer dynamiquement une requête pour avoir les types. Code :
SELECT * FROM typeA AS a, TypeB AS b WHERE a.id = truc AND b.id = machin ... Et donc avoir beaucoup de colonne inutile. |
|
|
00
|
|
|
#19 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 843 ![]() |
minimiser les échanges php-mysql est toujours plus efficace en terme de performance, surtout avec des centaines ou milliers d'enregistrement à passer en revu...
pour les données complexes et/ou hierarchisées tu peux utiliser le xml comme encodage de ce que tu récupère de ta bd... mysql sais interpréter le xml depuis la version 5.1.4 il me semble et php permet de le parcourir facilement aussi, selon ce que tu dois faire ça peut peut-être te donner des idées... techniquement parlant tes 2 appels pouvant être fait dans une procédure stockée, c'est plus performant de le faire coté mysql autan que possible
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
|
|
00
|
|
|
#20 |
|
Invité de passage
![]() Inscription : février 2008 Messages : 15 ![]() |
Ok avec tout ça je vais pourvoir faire ce que je veux.
Merci pour vos réponses. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com