2017-01-02 3 views
-3

je dois faire la requête suivante:Sélectionnez plusieurs tables dans MySQL

J'ai 4 tables, la première est la principale, où le « id » est étranger dans les 3 autres tables. J'ai besoin d'obtenir la date et la description de chacune des tables où elle présente le id_tabla1. Dans certains tableaux, j'ai plus d'enregistrements que dans l'autre.

Est-il possible de relier ces tables?

Tableau 1 principal

  1. id_table1
  2. Nom

Tableau 2

  1. id_table2
  2. Date
  3. Description
  4. fk_table1

Tableau 3

  1. id_table3
  2. Date
  3. Description
  4. fk_table1

Tableau 4

  1. id_table4
  2. Date
  3. Description
  4. fk_table1

Je veux obtenir quelque chose comme ceci:

enter image description here

+2

Ouais ... faire un 'JOIN' parmi les tables de la colonne' fk_table1' – Rahul

Répondre

1

Ce type d'opération est un peu d'une douleur en MySQL. En fait, le résultat n'est pas particulièrement "relationnel", car chaque colonne est une liste séparée. Vous ne pouvez pas faire un join car il n'y a pas de clé join.

Vous pouvez en générer un dans MySQL en utilisant des variables, puis utiliser l'agrégation. Voici un exemple avec deux tables:

select id_table1, 
     max(t2_date) as t2_date, 
     max(t2_desc) as t2_desc, 
     max(t3_date) as t3_date, 
     max(t3_desc) as t3_desc 
from ((select id_table1, NULL as t2_date, NULL as t2_desc, NULL as t3_date, NULL as t3_desc, 1 as rn 
     from table1 t1 
    ) t1 union all 
     (select fk_table1, date as t2_date, description as t2_desc, NULL as t3_date, NULL as t3_desc, 
       (@rn1 := if(@fk1 = fk_table1, @rn1 + 1, 
          if(@fk1 := fk_table1, 1, 1) 
         ) 
      ) as rn 
     from table1 t1 cross join 
      (select @rn1 := 0, @fk1 := 0) params 
     order by fk_table1, date 
    ) t1 union all 
     (select fk_table1, NULL, NULL, date as t3_date, description as t3_desc 
       (@rn2 := if(@fk2 = fk_table1, @rn2 + 1, 
          if(@fk2 := fk_table1, 1, 1) 
         ) 
      ) as rn 
     from table1 t1 cross join 
      (select @rn2 := 0, @fk2 := 0) params 
     order by fk_table1, date 
    ) 
    ) t 
group by id_table1, rn;