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 将联合起来。
条件:
如果 TABLE1 和 TABLE2 中有匹配的日期,它们将被合并
如果 TABLE1 或 TABLE2 中有单独的日期,则没有日期的 table 的 value/text 将变为 NULL
如果TABLE1或TABLE2中有一条记录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
这是一种方法...
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 之前。
以下是我的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 将联合起来。 条件:
如果 TABLE1 和 TABLE2 中有匹配的日期,它们将被合并 如果 TABLE1 或 TABLE2 中有单独的日期,则没有日期的 table 的 value/text 将变为 NULL 如果TABLE1或TABLE2中有一条记录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
这是一种方法...
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 之前。