如何将具有相同字段的两个表的结果合并为一个字段?

6

我有像这样的表格:

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

And I wanna have result:

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

我该怎么做?
添加: 对不起,我的英语不好。我有一个设备、设备模型和设备类型表,其中包含重复的字段counter_set_id。我想从counter_set选择字段,包括所有的counter_set_id值。我只需要从counter_set_id字段中获取值。
现在我有这个查询:
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;

这个返回了3列,但我需要所有的值在一列中。
我认为这是最终版本:
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;

link_id = 4 的情况下,name1 肯定是 null 吧?因为它没有对应的值。 - IamIC
7个回答

7

根据您提供的示例表格和期望的输出,看起来您可能需要一个FULL OUTER JOIN。并非所有供应商都实现了此功能,但您可以通过LEFT OUTER join和将表格反转后的EXCEPTION join联合模拟它,如下所示:

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

那么你的输出将会像这样:
NAME1   NAME2    LINK_ID
=====   =====    =======
text    <NULL>         1
text    text           2
<NULL>  text           4

嗯...但我认为MySQL不支持EXCEPTION JOIN =| - VeroLom

4

起初我认为使用join可以解决问题,但现在我不确定了... 我想使用某种类型的union。

说实话,我认为这是一个糟糕的设计。

select * from table1
union
select * from table2

3
我假设您是通过 link_id 字段进行联接。普通的联接将返回四行(其中两行相同)。您真正想要的不是合并字段,而是获取唯一的行。
只需使用 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

我需要将所有link_id值(实际上是counter_set_id)合并到一个列中,以便从另一张表中选择(...WHERE id IN (<counter_set_id values>);)。 - VeroLom

1

抱歉,我的英语不太好。我有devicedevice_modeldevice_type表,其中有重复的字段counter_set_id。我想从counter_set中选择所有counter_set_id的值,并且只需要获取counter_set_id字段的值。 - VeroLom

1

将所有ID选择到一个临时表中(在MySQL中的操作方式 - 在SQL Server中使用CTE),并将其用作您的连接表。


1
如果三列的值相同,就返回。
SELECT  `type`.`counter_set_id`
FROM ...

或者更好的方法是,如果它们有相同的值,你可以这样做:
SELECT  `dev`.`counter_set_id`
FROM    `device` AS `dev`
WHERE   `dev`.`id` = 4;

如果你想将它们连接起来(放到同一个字段中),请使用以下代码:
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

如果您不想重复一个字段的结果,请在查询末尾使用GROUP BY link_id

如果您只想显示link_id字段,则:

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

还要查找mysql手册中的CONCATCAST和其他有用的函数。希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接