2010-11-29 3 views
5

Je tables comme ceci:Comment joindre le résultat de deux tables avec le même champ dans un champ?

Table1    Table2 
    name1 | link_id  name2 | link_id 
    text  1   text   2 
    text  2   text   4 

Et je veux avoir résultat:

name1  name2  link_id 
text  text   1 
text  text   2 
text  text   4 

Comment puis-je faire cela?

AJOUTER: Sry, mon anglais n'est pas bon. J'ai les tables device, device_model et device_type avec le champ dupliqué counter_set_id. Je veux sélectionner les champs de counter_set avec toutes les valeurs de counter_set_id. Je dois chercher uniquement les valeurs des champs counter_set_id

Maintenant, j'ai cette requête:

SELECT `dev`.`counter_set_id`, `mod`.`counter_set_id`, `type`.`counter_set_id` 
FROM `device` AS `dev` 
LEFT JOIN `device_model` AS `mod` ON `dev`.`device_model_id` = `mod`.`id` 
LEFT JOIN `device_type` AS `type` ON `mod`.`device_type_id` = `type`.`id` 
WHERE `dev`.`id` = 4; 

Cela renvoie 3 colonnes mais je dois toutes les valeurs dans une colonne

C'est définitive variante je pense:

SELECT `dev`.`counter_set_id` 
FROM  `device` AS `dev` LEFT OUTER JOIN 
     `device_model` AS `mod` ON `dev`.`device_model_id` = `mod`.`id` 
WHERE `dev`.`id` = 4 AND 
     `dev`.`counter_set_id` IS NOT NULL 
UNION 
SELECT `mod`.`counter_set_id` 
FROM  `device_model` AS `mod` LEFT OUTER JOIN 
     `device` AS `dev` ON `mod`.`id` = `dev`.`device_model_id` 
WHERE `mod`.`counter_set_id` IS NOT NULL; 
+0

Sûrement name1 serait null pour link_id = 4? Il n'y a pas de valeur correspondante pour cela. – IamIC

Répondre

7

D'après les exemples de tableaux et la sortie désirée que vous avez fournis, il semble que vous souhaitiez un FULL OUTER JOIN. Tous les fournisseurs à mettre en œuvre, mais vous pouvez simuler avec LEFT OUTER JOIN et UNION à une exception se joindre aux tables renversées comme ceci:

Select name1, name2, A.link_id 
From table1 A Left Outer Join 
    table2 B on A.link_id = B.link_id 
Union 
Select name1, name2, link_id 
From table2 C Exception Join 
    table1 D on C.link_id = D.link_id 

alors votre sortie serait comme ceci:

NAME1 NAME2 LINK_ID 
===== ===== ======= 
text <NULL>   1 
text text   2 
<NULL> text   4 
+0

Merci! – VeroLom

+0

Hmm ... Mais je pense que MySQL ne supporte pas EXCEPTION JOIN = | – VeroLom

1

Quelle est la valeur de link_id 4 pour name1? Quelle est la valeur de link_id 1 pour name2?

Essayez de regarder les différents join-types ..

http://dev.mysql.com/doc/refman/5.0/en/join.html

Peut-être que j'ai mal compris la question à portée de main - désolé alors.

acclamations

+0

Sry, mon anglais n'est pas bon. J'ai les tables 'device',' device_model' et 'device_type' avec le champ dupliqué' counter_set_id'. Je veux sélectionner les champs de 'counter_set' avec toutes les valeurs de' counter_set_id'. Je dois récupérer des valeurs uniquement à partir des champs 'counter_set_id'. – VeroLom

3

Je suppose que vous rejoignez sur le terrain link_id. Une jointure normale entraînerait le retour de quatre lignes (dont deux sont identiques). Ce que vous demandez vraiment, ce n'est pas de combiner des champs, mais d'obtenir seulement les lignes distinctes.

Il suffit d'utiliser le mot-clé distinct:

select distinct t1.name1, t2.name2, t1.link_id 
from Table1 as t1 
inner join Table2 as t2 
    on t1.link_id = t2.link_id 
+0

J'ai besoin de toutes les valeurs de 'link_id' (vraiment' counter_set_id') combinées dans une colonne pour sélectionner dans une autre table (... WHERE 'id' IN (valeurs' '' counter_set_id'>) – VeroLom

3

Au début, je pensais que une jointure fonctionnerait, mais maintenant je ne suis pas sûr ... Im penser une union d'un certain type.

en toute honnêteté c'est un mauvais design imo.

select * from table1 
union 
select * from table2 
1

Si les trois colonnes ont la même valeur, juste

SELECT `type`.`counter_set_id` 
FROM ... 

Ou, mieux encore, si elles ont la même valeur, vous pouvez faire:

SELECT `dev`.`counter_set_id` 
FROM `device` AS `dev` 
WHERE `dev`.`id` = 4; 

Si vous voulez pour les concaténer (les mettre tous dans le même champ), utilisez ceci:

SELECT CONCAT(
    CAST(`dev`.`counter_set_id` AS CHAR), 
    ',', 
    CAST(`mod`.`counter_set_id` AS CHAR), 
    ',', 
    CAST(`type`.`counter_set_id` AS CHAR)) 
FROM ... 
1

Si vous ne voulez pas répéter un résultat de champ, utilisez GROUP BY link_id à la fin de votre requête

Si vous voulez afficher uniquement link_id champ alors:

SELECT DISTINCT ta.link_id 
FROM tblA AS ta 
INNER JOIN tblB AS tb 
ON ta.link_id = tb.link_id 

Regardez aussi pour CONCAT, CAST et autres fonctions utiles sur le manuel mysql J'espère que cela vous aidera.

1

Sélectionnez tous les ID dans une table temporaire (cependant cela fonctionne dans MySQL - un CTE dans SQL Server), et utilisez cela comme table de jointure.

Questions connexes