【问题标题】:MySQL merge two tables with different dataMySQL合并两个不同数据的表
【发布时间】:2015-04-25 21:42:06
【问题描述】:

以下是我的mysql表

表 1:

ID  | commonID | Date  | text | active
1     11         01.02   abc    1
2     11         02.02   123    1 
3     11         03.02   xyz    0

表 2:

ID  | commonID | Date  | value | active
1     11         01.02   abc    1
2     11         04.02   123    1 
3     11         03.02   xyz    1

最终结果应显示如下:

| date | text |   value
  01.02  abc      abc
  02.02  123      (null)
  03.02  (null)   xyz
  04.02  (null)   123

这里的想法是,合并两个表。示例中定义为 11 的 commonID​​ 的所有条目都将从两个表中选择。然后表格将被合并。 条件:

如果 TABLE1TABLE2 中有匹配的日期,它们将被合并 如果 TABLE1TABLE2 中有单独的日期,则没有日期的表的值/文本将变为 NULL 如果 TABLE1TABLE2 中存在 active = FALSE 的记录,则不会被处理。 两个表中可以有匹配和不匹配的日期。

我想用它来显示时间顺序事件,如果两个表中都有一个事件,应该只有一行。

这里有什么解决方案?

【问题讨论】:

标签: mysql join merge


【解决方案1】:

这是一种方法...

SELECT commonid
     , date
     , MAX(text) text
     , MAX(value) value
  FROM 
     ( SELECT id
            , commonid
            , date
            , text
            , NULL value
            , active
         FROM table1
        WHERE active <> 0

        UNION

       SELECT id
            , commonid
            , date
            , NULL
            , value
            , active
         FROM table2
        WHERE active <> 0
     ) x
 GROUP
    BY commonid,date;

如果愿意,您可以将 WHERE active &lt;&gt; 0 位从 UNION 中移出,移到 GROUP BY 之前。

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT T1.date,
           CASE WHEN T1.active = 1 THEN T1.text END as text,
           CASE WHEN T2.active =1 THEN T2.value END as value
    FROM Table1 T1 LEFT JOIN
         Table2 T2 ON T1.date=T2.date
    UNION
    SELECT T2.date,
           CASE WHEN T1.active = 1 THEN T1.text END as test,
           CASE WHEN T2.active = 1 THEN T2.value END as value
    FROM Table1 T1 RIGHT JOIN
         Table2 T2 ON T1.date=T2.date
    

    结果:

    DATE    TEXT    VALUE
    01.02   abc     abc
    02.02   123     (null)
    03.02   (null)  xyz
    04.02   (null)  123
    

    示例SQL Fiddle

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT t1.date,t1.text,t2.value FROM table1 t1
      LEFT JOIN table2 t2 ON t1.commonId = t2.commonId and t1.date = t2.date and t2.active = 1
      where t1.active = 1
      UNION
      SELECT t2.date,t1.text,t2.value FROM table2 t2
      LEFT JOIN table1 t1 ON t1.commonId = t2.commonId and t1.date = t2.date and t1.active = 1
      where t2.active = 1
      

      示例http://sqlfiddle.com/#!2/d2c4d/2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-30
        • 2012-02-18
        • 2012-12-11
        • 2014-07-15
        • 2022-01-01
        • 2014-01-22
        相关资源
        最近更新 更多