表名称是来源
ID | date | valueS | commonID
1 26.8.14 Svalue01 11
2 21.8.14 Svalue02 11
3 25.8.14 Svalue03 11
表B名称是目的地
ID | date | valueD | commonID
1 26.8.14 Dvalue01 11
2 21.8.14 Dvalue03 11
3 24.8.14 Dvalue03 11
所以目前我正在使用
SELECT a.*, b.* FROM (SELECT * FROM Source WHERE commonID = '11')a JOIN destination b ON a.commonID = b.commonID
但这不能得到我希望的结果。
我想要按日期排序的东西,如果日期上没有记录,则一个为零。
示例应该如何显示
ID | date | valueD | commonID | ID | date | valueS | commonID
1 26.8.14 Dvalue01 11 1 26.8.14 Svalue01 11
3 25.8.14 Svalue03 11
3 24.8.14 Dvalue03 11
2 21.8.14 Dvalue03 11 2 21.8.14 Svalue02 11
是否以及如何实现?
其他信息:
- 使用Mysql 5.5.37(MariaDB) -ID是两者的主要内容 -date字段是"时间戳" -value字段是INT -ID字段是INT -Engine是InnoDB
我希望我提供了足够的信息,并试图提出一个很好的解释问题
谢谢你的帮助
答案 0 :(得分:0)
您需要全外连接
SELECT s.id, s.date, s.valueS, d.valueD, d.commonID FROM source s LEFT JOIN destination d ON (s.id = d.id)
UNION
SELECT s.id, s.date, s.valueS, d.valueD, d.commonID FROM source s RIGHT JOIN destination d ON (s.id = d.id);
答案 1 :(得分:0)
你想加入日期,因为这是确定列,所以像这样
SELECT
COALESCE(s.id, "") as s_id,
COALESCE(s.date, "") as s_date,
COALESCE(s.valueS, "") as 'valueS',
COALESCE(s.commonID, "") as s_commonID,
COALESCE(d.id, "") as d_id,
COALESCE(d.date, "") as d_date,
COALESCE(d.valueD, "") as 'valueD',
COALESCE(d.commonID, "") as d_commonID
FROM source s
LEFT JOIN destination d on d.date = s.date
AND d.commonID = s.commonID
WHERE d.commonID = 11
UNION
SELECT
COALESCE(s1.id, "") as s_id,
COALESCE(s1.date, "") as s_date,
COALESCE(s1.valueS, "") as 'valueS',
COALESCE(s1.commonID, "") as s_commonID,
COALESCE(d1.id, "") as d_id,
COALESCE(d1.date, "") as d_date,
COALESCE(d1.valueD, "") as 'valueD',
COALESCE(d1.commonID, "") as d_commonID
FROM source s1
RIGHT JOIN destination d1 on d1.date = s1.date
AND d1.commonID = s1.commonID
WHERE d1.commonID = 11
ORDER BY s_date DESC, d_date DESC
答案 2 :(得分:0)
我会针对这个问题采用不同的解决方案。首先,生成所需的所有常用ID和日期的叉积,然后使用left join
引入其他行。
您只需要commonid
的一个值,所以这对您的问题来说有点过分:
select s.*, dest.*
from (select 11 as commonid) c cross join
(select date from source union
select date from destination
) d left outer join
source s
on s.commonid = c.commonid and s.date = d.date left outer join
destination dest
on dest.commonid = c.commonid and dest.date = d.date;
但它很容易扩展。如果你想要两个常见ID,你可以使用:
select s.*, dest.*
from (select 11 as commonid union all select 12) c cross join
(select date from source union
select date from destination
) d left outer join
source s
on s.commonid = c.commonid and s.date = d.date left outer join
destination dest
on dest.commonid = c.commonid and dest.date = d.date;