【问题标题】:How to join result from two tables with same field into one field?如何将具有相同字段的两个表的结果连接到一个字段中?
【发布时间】:2011-05-17 07:56:15
【问题描述】:

我有这样的表格:

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

我想要结果:

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

我该怎么做?

添加: 对不起,我的英语不好。我有带有重复字段 counter_set_id 的 device、device_model 和 device_type 表。我想从 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 肯定为空吗?它没有对应的值。

标签: sql mysql join union


【解决方案1】:

根据您提供的示例表和所需的输出,听起来您可能需要 FULL OUTER JOIN。并非所有供应商都实现了这一点,但您可以使用 LEFT OUTER 连接和 UNION 到 EXCEPTION 连接来模拟它,表格反转如下:

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 =|
【解决方案2】:

起初我认为加入会起作用,但现在我不确定......我正在考虑某种类型的联合。

老实说,这是一个糟糕的设计。

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>);
    【解决方案4】:

    link_id 4 对 name1 有什么值? name2 的 link_id 1 有什么值?

    尝试查找不同的 JOIN-Types ..

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

    也许我误解了手头的问题 - 对不起。

    干杯

    【讨论】:

    • 对不起,我的英语不好。我有devicedevice_modeldevice_type 表与重复字段counter_set_id。我想从counter_set 中选择所有值为counter_set_id 的字段。我只需要从counter_set_id 字段中获取值。
    【解决方案5】:

    如果三列的值相同,就

    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 ...
    

    【讨论】:

      【解决方案6】:

      如果您不想重复字段结果,请在查询末尾使用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 手册中寻找 CONCAT , CAST 和其他有用的函数 希望对您有所帮助。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多