2011-09-15 2 views
0

J'ai trois tables (deb, dos, char) et je suis à la recherche d'une requête SQL pour obtenir la table result comme indiqué ci-après:Comment joindre plusieurs tables en une avec MySQL?

table: deb 
+----+-------------+--------+ 
| id | label  | dos_id | 
+----+-------------+--------+ 
| 1 | right  |  1 | 
| 2 | left  |  2 | 
+----+-------------+--------+ 

table:char 
+----+-------------+--------+ 
| id | name  | dos_id | 
+----+-------------+--------+ 
| 1 | jack  |  1 | 
| 2 | thaw  |  1 | 
| 3 | lbaz  |  2 | 
| 4 | amar  |  3 | 
+----+-------------+--------+ 

table:dos 
+----+-------------+ 
| id | color  | 
+----+-------------+ 
| 1 | black  | 
| 2 | white  | 
+----+-------------+ 


result table 
+----+-------------+--------+ 
| id | color  | value | 
+----+-------------+--------+ 
| 1 | black  | right | 
| 1 | black  | jack | 
| 1 | black  | thaw | 
| 2 | white  | left | 
| 2 | white  | lbaz | 
| 2 | white  | amar | 
+----+-------------+--------+ 

J'ai essayé rejoignant gauche et à droite, mais il n » t travail.

Ce que je cherche, c'est que pour chaque ligne dos, je reçois les valeurs correspondantes char et deb dans une autre colonne.

Peut-être que faire une rangée sélectionner une requête dans un pourrait aider. Je ne sais pas.

S'il vous plaît aidez-moi et merci.

Répondre

1

Vous devez exécuter 2 requêtes séparées et combiner les résultats en un seul jeu de résultats. Vous pouvez le faire en utilisant l'opérateur UNION comme ceci:

SELECT * FROM 
(
    SELECT dos.id id, dos.color color, deb.label value 
    FROM dos INNER JOIN deb on dos.id = deb.dos_id 
    UNION 
    SELECT dos.id id, dos.color color, char.name value 
    FROM dos INNER JOIN char on dos.id = char.dos_id 
) 
ORDER BY id 

EDIT:

SELECT * 
FROM 
( 
    SELECT dos.id AS id, dos.date_facture AS facture, deb.libelle AS lbl, '' AS nom 
    AS lbl FROM jos_tktransit_dossier dos INNER JOIN jos_tktransit_deboure deb ON dos.id = deb.id_dossier 
    UNION 
    SELECT dos.id AS id, dos.date_facture AS facture, '' AS lbl, charg.nom_charge AS nom 
    FROM jos_tktransit_dossier dos INNER JOIN jos_tktransit_charge_assistance charg ON dos.id = charg.id_dossier 
) 
+0

i obtenu ce « 1248 - Chaque table dérivée doit avoir son propre alias » et ceci est ma requête SELECT * FROM ( SELECT dos.id AS id, dos.date_facture AS facture, deb.libelle AS LBL DE jos_tktransit_dossier AS dos INNER JOIN jos_tktransit_deboure AS deb SUR dos.id = deb .id_dossier UNION SELECT dos.id AS id, dos.date_facture AS facture, charg.nom_charge AS nom DE jos_tktransit_dossier AS dos INNER JOIN jos_tktransit_charge_assistance AS charg SUR dos.id = charg.id_dossier ) –

+0

que wont travail parce que vous avez autre domaine noms dans les deux requêtes. Ils doivent être les mêmes. Dans mon exemple, les deux requêtes renvoient (id, color, value), mais les requêtes de votre commentaire renvoient (id, facture, lbl) et (id, facture, nom). lbl! = nom, donc l'UNION ne fonctionnera pas. – StevieG

+0

merci mais y at-il une autre solution –

0

Peut-être quelque chose comme:

SELECT dos.id, color, deb.label as value FROM dos, deb WHERE dos_id = dos.id 
UNION SELECT dos.id, color, char.name as value FROM dos, char WHERE dos_id = dos.id; 
+0

i obtenu ce "1248 - Chaque table dérivée doit avoir son propre alias" et c'est ma requête SELECT * FROM ( SELECT dos.id AS id, dos.date_facture AS facture, deb.libelle AS LBL DE jos_tktransit_dossier AS dos INNER JOIN jos_tktransit_deboure AS deb ON dos.id = deb.id_dossier UNION SELECT id.id AS id, dos.date_facture AS facture, charg.nom_charge AS nom FROM jos_tktransit_dossier AS dos INNER JOIN jos_tktransit_charge_assistance AS charg ON dos.id = charg.id_dossier ) –

0

les opérations suivantes:

(select d.id,d.color,c.name from dos d , char1 c where d.id=c.dos_id) union (select d.id,d.color,e.label from dos d, deb e where d.id= e.dos_id)

Cela devrait génèrerait les éléments suivants:

ID COLOR NAME 
1 black jack 
1 black right 
1 black thaw 
2 white lbaz 
2 white left 

... mais il ne montre pas les valeurs dans le bon ordre:

+----+-------------+--------+ 
| id | color  | value | 
+----+-------------+--------+ 
| 1 | black  | right | 
| 1 | black  | jack | 
| 1 | black  | thaw | 
| 2 | white  | left | 
| 2 | white  | lbaz | 
| *2 | white  | amar* | 
+----+-------------+--------+