按日期加入两个表顺序,并将0值设置为空列

时间:2014-12-07 05:29:02

标签: mysql

我有两个不同的表:第一个表用于为声明其产品的用户发送数据

  +---+-----------+----------+--------+
  |id |  claimed  |  date    | ref no |
  +---+-----------+----------+--------+
  | 1 |   20      | 20-02-13 | sda123 |
  | 2 |   30      | 22-02-13 | sda123 |
  | 3 |   40      | 24-02-13 | sda123 |
  | 4 |   50      | 26-02-13 | sda123 |
  +---+-----------+----------+--------+

第二个表用于为添加产品的用户保存数据。

  +---+-----------+----------+--------+
  |id |  added    |  date    | ref no |
  +---+-----------+----------+--------+
  | 1 |   15      | 21-02-13 | sda123 |
  | 2 |   25      | 23-02-13 | sda123 |
  | 3 |   35      | 25-02-13 | sda123 |
  | 4 |   45      | 27-02-13 | sda123 |
  +---+-----------+----------+--------+

现在我想加入这两张桌子。但我希望根据日期加入他们。如果在提及的日期用户仅添加了产品,则在声明的列中将设置为0,并且副verca。

sda123

的历史记录
  +-----------+----------+------------+
  |  claimed  |  added   |    date    |   
  +-----------+----------+------------+
  |   20      |     0    |  20-02-13  |
  |   0       |    15    |  21-02-13  |
  |   30      |     0    |  22-02-13  |
  |   0       |    25    |  23-02-13  |
  +-----------+----------+------------+

任何人都可以帮我在sql中执行此操作吗?提前致谢。

2 个答案:

答案 0 :(得分:0)

您选择所有日期的并集,然后将其与两个表连接以获得总结:

SELECT COALESCE(SUM(`claimed`), 0) `claimed`, COALESCE(SUM(`added`),0) `added`, `date`
FROM (SELECT `date` FROM `claimed` UNION SELECT `date` FROM `added`) `dates`
LEFT JOIN `claimed` USING (`date`)
LEFT JOIN `added` USING (`date`)
GROUP BY `date`
ORDER BY `date`;

我使用COALESCE()阻止NULL出现在结果中;相反,它将显示0(如果任一表中的相应值对于该特定日期不存在)。您可以使用COALESCE()代替IFNULL(),因为只有一个要评估的值。

Demo

答案 1 :(得分:0)

使用LEFT JOIN并用零替换NULL,如下所示:

SELECT CLAIMED.claimed, IFNULL(ADDED.added, 0), CLAIMED.date 
FROM CLAIMED JOIN ADDED ON CLAIMED.date=ADDED.date

我使用了大写字母表名,因为你没有指定它们。