2010-11-29 9 views
5

tengo tablas como esta:Cómo unirse a consecuencia de dos tablas con un mismo campo en un campo?

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

Y yo quiero tener resultado:

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

¿Cómo puedo hacer esto?

ADD: Sry, mi Inglés no es bueno en. Tengo tablas de dispositivos, DEVICE_MODEL y DEVICE_TYPE con counter_set_id campo duplicado. Quiero seleccionar campos de counter_set con todos los valores de counter_set_id. Tengo que ir a buscar sólo los valores de los campos counter_set_id

Ahora tengo esta consulta:

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; 

Esto devuelve 3 columnas pero necesito todos los valores en una columna

Ésta es la variante definitiva pienso:

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

Seguramente nombre1 sería nulo para link_id = 4? No hay un valor correspondiente para eso. – IamIC

Respuesta

7

Según las tablas de muestra y la salida deseada que proporcionó, parece que podría querer un FULL OUTER JOIN. No todos los proveedores implementan esto, pero se puede simular con una combinación externa izquierda y una unión a una excepción se unen a las mesas invertidas como esto:

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 

entonces su salida sería así:

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

¡Gracias! Esto es lo que Necesito! – VeroLom

+0

Hmm ... Pero creo que MySQL no es compatible con EXCEPTION JOIN = | – VeroLom

1

¿Qué valor tiene link_id 4 para name1? ¿Qué valor link_id 1 tiene por nombre 2?

Intente buscar los diferentes tipos .. Join-

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

Tal vez entienden mal la pregunta a la mano - lo siento entonces.

aplausos

+0

Sry, mi inglés no es bueno. Tengo las tablas 'device',' device_model' y 'device_type' con el campo duplicado' counter_set_id'. Quiero seleccionar campos de 'counter_set' con todos los valores de' counter_set_id'. Necesito obtener valores solo de los campos 'counter_set_id'. – VeroLom

3

Estoy asumiendo que se está uniendo en el campo link_id. Una unión normal daría como resultado la devolución de cuatro filas (dos de las cuales son idénticas). Lo que realmente está pidiendo no es combinar campos, sino obtener solo las filas distintas.

sólo tiene que utilizar la palabra clave 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

Necesito todos los valores 'link_id' (realmente' counter_set_id') combinados en una columna para seleccionar de otra tabla (... WHERE 'id' IN (<' counter_set_id' values>); – VeroLom

3

Al principio pensé que se unen a una funcionaría, pero ahora no estoy seguro ... Im pensando una unión de algún tipo.

en honor a la verdad este es un mal diseño de la OMI.

select * from table1 
union 
select * from table2 
1

Si las tres columnas tienen el mismo valor, simplemente

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

O, mejor aún, si tienen el mismo valor, que puede hacer:

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

Si desea para concatenarlos (ponerlos todos en el mismo campo), use esto:

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 no desea repetir un resultado de campo, utilice GROUP BY link_id al final de la consulta

Si desea mostrar solamente link_id campo, entonces:

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

También busque CONCAT, CAST y otra funciones útiles en el manual de mysql Espero que esto te ayude.

1

Seleccione todos los ID en una tabla temporal (sin embargo, eso funciona en MySQL - un CTE en SQL Server), y úselo como su tabla de unión.

Cuestiones relacionadas