2011-03-18 3 views
0

J'ai besoin de faire une requête MySQL pour afficher les données de 3 tables différentes.Sélection MYSQL à partir de 3 tables ou plus

Voici le tableau 1:

TABLE1

  • id

  • référence

  • Nom

  • email

Voici le tableau 2:

Tableau 2:

  • id

  • téléphone

Voici le tableau 3:

TABLE3:

  • id

  • téléphone

Je dois afficher toutes les données de table1, ainsi que le téléphone de table2 ou table3, seulement si l'identifiant dans table2 ou table3 est le même nombre que dans le champ de référence dans la table1.

Un conseil? Je vous remercie!

Répondre

0
SELECT t1.*, t2.*, t3.* 
FROM table1 t1 JOIN table2 t2 
    ON t1.reference = t2.ID 
JOIN table3 t3 
    ON t1.reference = t3.ID 
+0

ne fonctionne pas, renvoie 0 articles, la référence dans le tableau 1 sera dans la table2 ou la table3, pas dans les 2 tables à la fois. – nmarti

0

Je ne sais pas si vous pouvez faire de case en sélection dans une base MySQL, mais vous pouvez essayez une instruction CASE en tant que colonne et rejoignez-la. Voici un code sudo.

SELECT t1.*, CASE t2.phone IS NOT t3.phone THEN t3.phone ELSE t2.phone END CASE as PhoneNumber 
FROM Table1 t1 
LEFT JOIN Table2 t2 ON t1.reference = t2.id 
LEFT JOIN Table3 t3 ON t1.reference = t3.id 
2

Oui, j'ai un conseil, modifiez votre structure. Il ne sert à rien d'avoir des tables différentes pour contenir différents numéros de téléphone. Voici quelque chose que vous pouvez faire:

table1(-- you should give it a better name 
    id, 
    -- reference, -- not needed now... 
    name, 
    email 
); 

phone_numbers(
    id, 
    table1_id, 
    phone 
); 

Maintenant, vous pouvez faire quelque chose comme:

SELECT table1.*, GROUP_CONCAT(phone) 
FROM  table1 
LEFT JOIN phone_numbers ON table1.id = table1_id 
GROUP BY table1.id, name, email -- , whatever fields you have more on table1 
+0

Salut, j'ai simplifié les tables pour cet exemple, mais j'utilise diferents tables parce que pour l'inscription dans les différents cours, et les données sont maintenant dans les tables, donc je ne peux pas modifier la structure:/ – nmarti

+0

@nmarti, Ok, mais je ne peux pas deviner ça. De votre question, la seule chose que je peux voir est que votre structure ne devrait pas être comme ça et que la modifier aiderait. Et je crois toujours qu'il ne sert à rien d'avoir deux tables pour contenir le même type de données. : -/ – acm

1

Vous avez demandé un téléphone de table2 ou de table3.

Parce que ces 2 tables ont des colonnes communes, nous pouvons simplifier tout cela et penser à ces 2 tables comme une seule, en utilisant une clause UNION:

select table1.*, v.phone 
    from table1 
    inner join (select * from table2 
       union 
      select * from table3) v on v.id = table1.reference 

EDIT: Les noms de table corrigées dans l'union

+0

Je pense que vous devriez utiliser 'INNER JOIN' au lieu de' LEFT JOIN', parce que l'OP a besoin de * pour afficher toutes les données de table1, et aussi le téléphone de table2 ou table3, * *** seulement si *** * l'ID de table2 ou table3 est le même que celui qui se trouve dans le champ de référence de la table1 *. –

+0

Cette solution peut également dupliquer les lignes 'table1', si' table2' et 'table3' contiennent des lignes ayant les mêmes' id's et des numéros de téléphone différents. –

+0

@Andriy M D'accord, j'ai négligé cela. Modifier terminé. Merci! –