以下是我的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
这里的想法是合并两个表。将从两个表中选择示例中具有已定义的commonID(例如11)的所有条目。表格将统一起来。 条件:
如果 TABLE1 和 TABLE2 中有匹配日期,则会合并 如果 TABLE1 或 TABLE2 中有个人日期,则没有日期的表的值/文本将变为NULL 如果 TABLE1 或 TABLE2 中的记录 active = FALSE ,则不会处理该记录。 BOTH表中可以有匹配和不匹配的日期。
我想用它来显示时间顺序事件,如果两个表中都有一个事件,那么应该只有一行。
这里的解决方案是什么?
答案 0 :(得分:1)
试试这个:
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。
答案 1 :(得分:0)
试试这个:
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
答案 2 :(得分:0)
这是单程......
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之前。