Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/05/2011, 15h58   #1
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 3
Points : 3
Par défaut Select sur plusieurs tables dynamiques

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 ...
Mais j'ai fini par déduire que l'on ne peut pas utiliser des procédures ou de CASE dans FROM.

Donc je ne vois plus comment faire, à par passer par un programme.
Avez-vous une idée ?
Merci.
skill-san est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 07h27   #2
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
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
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 12h08   #3
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 3
Points : 3
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.
skill-san est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 12h27   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 998
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 998
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
Pourquoi ne pas faire des vues qui réuniraient les caractéristiques de base de l'objet et celles de son type.
Code :
1
2
3
4
CREATE VIEW AS
SELECT o.id, o.lieu, a.carac1, a.carac2 -- ...
FROM objet o
INNER JOIN objet_type_A a ON a.id_objet = o.id
__________________
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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 14h25   #5
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 3
Points : 3
ç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 :
1
2
3
SELECT *
FROM objet o, type_A
WHERE ...
A moins que je n'ai pas compris quelque chose.


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
-> RC5

où RC = table construction
et 5 = id dans cette table
Code :
SELECT * FROM construction WHERE id = 5
Et là si j'élargis la recherche sur un "lieu", j'ai entre 10 et 100 objets voir plus et donc autant de requête.
skill-san est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 14h44   #6
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 14h50   #7
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
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?
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 16h23   #8
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 3
Points : 3
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 :
1
2
PREPARE dim1 FROM  CONCAT('SELECT * FROM ',retourtable('RC1'));
EXECUTE dim1;
Erreur
Citation:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CONCAT('SELECT * FROM ',retourtable('RC1'))' at line 1
skill-san est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 16h58   #9
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
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 :
1
2
3
4
@req= CONCAT('SELECT * FROM ',retourtable('RC1'));
PREPARE dim1 FROM @req;
EXECUTE dim1;
deallocate prepare dim1;
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 17h00   #10
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 3
Points : 3
Bon voilà :

Code :
1
2
3
4
5
6
7
SET @code = 0;
SELECT `code`INTO @code FROM `test_A` WHERE `id` =1;
 
SET @req= CONCAT('SELECT * FROM ',retourtable(@code));
PREPARE dim1 FROM @req;
EXECUTE dim1;
deallocate prepare dim1;
ça marche bien mais que pour un.
Comment faire pour plusieurs ?

On y est presque
skill-san est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 17h57   #11
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
qu'est ce qui ne marche pas pour les autres?
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 13h02   #12
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 3
Points : 3
Code :
1
2
3
4
5
6
7
8
SET @code = 0;
SELECT `code`INTO @code FROM `test_A` WHERE `lieu` =1;
 
SET @req= CONCAT('SELECT * FROM ',retourtable(@code));
PREPARE dim1 FROM @req;
EXECUTE dim1;
deallocate prepare dim1;
Renvoi tous les objets du lieu, mais ça ne marche pas avec INTO donc comment faire ?
skill-san est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 14h15   #13
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
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.
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 15h19   #14
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 3
Points : 3
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é
skill-san est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 15h43   #15
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
ç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...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 13h49   #16
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 3
Points : 3
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 ?
skill-san est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 13h56   #17
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
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
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 10h28   #18
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 3
Points : 3
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 ...
Ou comme tu dis regrouper toutes les infos des types sur une table.
Et donc avoir beaucoup de colonne inutile.
skill-san est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 10h41   #19
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
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
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 12h11   #20
Invité de passage
 
Inscription : février 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 15
Points : 3
Points : 3
Ok avec tout ça je vais pourvoir faire ce que je veux.
Merci pour vos réponses.
skill-san est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h38.


 
 
 
 
Partenaires

Hébergement Web