MySQL合并两个不同数据的表

MySQL merge two tables with different data

以下是我的mysqltables

Table 1:

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

Table 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

这里的想法是合并两个 table。所有具有已定义 commonID​​(如示例中的 11)的条目将从两个 table 中选择。然后 tables 将联合起来。 条件:

如果 TABLE1TABLE2 中有匹配的日期,它们将被合并 如果 TABLE1TABLE2 中有单独的日期,则没有日期的 table 的 value/text 将变为 NULL 如果TABLE1TABLE2中有一条记录active = FALSE,则不会被处理. tables.

中可以有匹配和不匹配的日期

我想用它来显示按时间顺序排列的事件,如果在两个 table 中都有一个事件,那么应该只有一行。

这里的解决方案是什么?

试试这个:

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.

试试这个:

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

这是一种方法...

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 <> 0 位从 UNION 移到 GROUP BY 之前。