IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Select sur plusieurs tables dynamiques


Sujet :

SQL Procédural MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 13
    Points
    13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    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.

  4. #4
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Pourquoi ne pas faire des vues qui réuniraient les caractéristiques de base de l'objet et celles de son type.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    ç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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT type_base FROM objet WHERE id = un nombre
    -> RC5

    où RC = table construction
    et 5 = id dans cette table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Avez vous pensé a utiliser du SQL Dynamique ?

  7. #7
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    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?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PREPARE dim1 FROM  CONCAT('SELECT * FROM ',retourtable('RC1'));
    EXECUTE dim1;
    Erreur
    #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

  9. #9
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @req= CONCAT('SELECT * FROM ',retourtable('RC1'));
    PREPARE dim1 FROM @req;
    EXECUTE dim1;
    deallocate prepare dim1;

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Bon voilà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  11. #11
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    qu'est ce qui ne marche pas pour les autres?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  13. #13
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    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.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    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é

  15. #15
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    ç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...

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    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 ?

  17. #17
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    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

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  19. #19
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    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

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Ok avec tout ça je vais pourvoir faire ce que je veux.
    Merci pour vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. select sur plusieurs tables
    Par julien.63 dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/05/2006, 18h29
  2. [SQL Access] SELECT sur plusieurs Tables et Composer Champs
    Par Giuseppe dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 07/11/2005, 15h00
  3. SELECT sur plusieurs Tables et Composer Champs
    Par Giuseppe dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/11/2005, 13h27
  4. un seul SELECT sur plusieurs tables ?
    Par deloo dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/09/2005, 13h57
  5. select sur plusieurs table, question sur jointure
    Par Schulman dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/09/2004, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo