2010-03-24 6 views
1

J'ai la table:mysql - se joindre à trois tables d'avoir

id name type 

où "type" est 1 ou 2

je dois rejoindre cette table avec deux autres. Les lignes avec "type = 1" doivent être jointes avec la première table, et = 2 avec la seconde. Par exemple, la table principale contient certains événements que les gens ont fait. La première table à rejoindre est l'information sur les hommes, et la seconde concerne les femmes. Le type est le sexe.
J'ai besoin de prendre les 10 derniers événements avec toutes les informations sur ces peuples.

Quelque chose comme

SELECT * 
FROM tbl 
INNER JOIN tbl_1 ON tbl.name = tbl_1.name HAVING tbl.type = 1 
INNER JOIN tbl_2 ON tbl.name = tbl_2.name HAVING tbl.type = 2 

Mais il ne ne fonctionne pas.
Comment cela peut-il être implémenté?

Répondre

2

Tout d'abord, la clause HAVING est destinée au regroupement et non aux jointures. Il suffit inclure la condition dans la clause ON

ON tbl.name = tbl_1.name AND tbl.type = 1 

En second lieu, si la condition est lettre morte, la ligne ne sera pas apparaître dans le résultat d'une jointure interne. Comme un champ (tbl.type) ne peut pas avoir deux valeurs différentes, aucune ligne ne sera générée. Essayez une jointure externe gauche à la place.

SELECT * 
    FROM tbl 
    LEFT JOIN tbl_1 ON tbl.name = tbl_1.name AND tbl.type = 1 
    LEFT JOIN tbl_2 ON tbl.name = tbl_2.name AND tbl.type = 2 

Cependant, cela soulève la question: pourquoi ne pouvez pas vous permettre tous les champs du résultat, et d'ignorer ceux que vous ne se soucient pas?

+0

La différence entre LEFT (OUTER) JOIN et INNER JOIN doit être soulignée. Une INNER JOIN ne vous donnera aucun résultat. – erikkallen

1

Il semble que vous essayiez de lier deux ensembles de données distincts - avez-vous envisagé d'utiliser un regroupement d'utilisateurs sur deux requêtes? Quelque chose comme:


select * from tbl inner join tbl_1 on tbl.name = tbl1.name where tbl.type = 1 
union all 
select * from tbl inner join tbl_2 on tbl.name = tbl2.name where tbl.type = 1 

Ceci, bien sûr, suppose vos deux tables jointes ont la même configuration de colonne.

L'utilisation de Having n'a aucun sens dans ce cas car vous n'effectuez pas de requête agrégée.