Probleme Jointure entre plusieurs tables

Résolu
Je travaille sur un application PHP, Mysql dont j'ai une base composé de trois tables :
table 1 : objects (id, nom) [352093088485056, objects01 ; 358480086797737, objects02]
table 2 : objects_data_352093088485056(post,haut)
table 3 : objects_data_358480086797737(post,haut)
Comment je peut faire la jointure entre ces trois tables pour que je puisse récupérer toutes les
informations ?
Pour info : j'ai pas la possiblité d'ajouter des clés étrangres au niveau de tables
articles_data_352093088485056 , articles_data_358480086797737

4 réponses

  1. Modérateur
    Bonjour,

    Cela semble une super mauvaise structure des données.

    Avec 3 tables tu peux faire un sql comme, en remplaçant les 1 et les 2 par tes identifiants.

    SELECT * FROM obj
    right OUTER join obj_1 on 0=0
    where id=1
    UNION
    SELECT * FROM obj
    right OUTER join obj_2 on 0=0
    where id=2 


    Avec 100, 1000 tables ... il faut probablement passer par une procédure PLSQL (si ça existe en Mysql ?).

    Ou sinon un sql qui va générer en spool un sql
    SELECT CONCAT("SELECT * FROM obj right OUTER join obj_",id," on 0=0 where id=",id," union ") from obj


    0
    1. Bonjour Monsieur,
      Merci pour votre retour : La première solution c'est impossible j'ai 600 tables :(
      En Mysql : c'est possible de faire des procédure mais j'ai pas aucune idée
      La deuxième : j'ai pas bien compris l'exemple ; j'ai appliquer ce truc dans ma basse et j'ai pas eux la bonne résultat toujours : SELECT * FROM ...
      SELECT * FROM ...
      Merci d'avance pour votre aide
      0
      1. Modérateur
        600 tables, schéma à la con ! celui qui a conçu cela n'a rien compris aux SGBD

        Donc il faut te mettre aux procédures

        J'ai une base avec 3 lignes dans obj et 3 tables obj_x

        Avec
        SELECT CONCAT("SELECT * FROM obj right OUTER join obj_",id," on 0=0 where id=",id,"\n union ") from obj


        Je mets le résultat dans un fichier texte
        SELECT * FROM obj right OUTER join obj_1 on 0=0 where id=1
        union
        SELECT * FROM obj right OUTER join obj_2 on 0=0 where id=2
        union
        SELECT * FROM obj right OUTER join obj_3 on 0=0 where id=3
        union


        je supprime le dernier union en trop, et je lance le sql ainsi obtenu, j’obtiens alors le resultat


        Avec tables la requete devrait être :
        SELECT CONCAT("SELECT * FROM objects right OUTER join objects_data_",id," on 0=0 where id=",id,"\n union ") from objects


        mais un sql avec 600 union ???
        0
      2. Contributeur Ambassadeur
        @jee peebonjour,
        puisque c'est du PHP, il me semble assez simple d'utiliser la première table pour obtenir les noms des autres tables, et d'ensuite parcourir toutes les tables pour en récupérer toutes les informations.
        0
      3. Contributeur Ambassadeur
        je me demande pourquoi indiquer au départ qu'il y a trois tables, pour ensuite clarifier qu'il y en a 600.
        0
      4. @yg_beJ'ai donnée un exemple : si j'arrive a trouver la bonne requête avec 3 tables je peut l'appliquer même sur 1000 tables .
        0
      5. @yg_beBonjour,
        Merci pour votre retour ,
        Est-il possible de nous expliquer des plus : est-il possible d'appliquer ce truc sur les tables faites par @jee pee en haut.
        Merci d'avance
        0
    2. Contributeur Ambassadeur
      à quoi servent les tables articles_data_, elles complètent les tables objects_data_?
      0
      1. 1- La table objects c'est la table principale : Lors de l'ajout d'un nouveau object l'insertion est faite
        au niveau de cette table : l'utilisateur ajoute les informations fixes.
        2- Les tables : objects_data_xxx ce sont les tables utilisées pour stocker des informations
        et pour assurer l'archivages vue que les informations sont très volumineux (plus que 500000 lignes par jours).
        0
        1. Contributeur Ambassadeur
          et articles_data_xxx?
          0
        2. @yg_bec'est objects_data_xxx
          Problème résolue avec simple boucle for
          0