MySQL合并表,零值

时间:2014-08-26 15:55:51

标签: mysql sql join

表名称是来源

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

我希望我提供了足够的信息,并试图提出一个很好的解释问题

谢谢你的帮助

3 个答案:

答案 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

DEMO

答案 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;