Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 按日期联接两个表order,并将0值设置为空列_Mysql - Fatal编程技术网

Mysql 按日期联接两个表order,并将0值设置为空列

Mysql 按日期联接两个表order,并将0值设置为空列,mysql,Mysql,我有两个不同的表:第一个表用于为声明其产品的用户发送数据 +---+-----------+----------+--------+ |id | claimed | date | ref no | +---+-----------+----------+--------+ | 1 | 20 | 20-02-13 | sda123 | | 2 | 30 | 22-02-13 | sda123 | | 3 | 40 | 2

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

  +---+-----------+----------+--------+
  |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,反之亦然

sda123的历史


有谁能帮我在sql中做这件事吗?提前谢谢

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

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。您也可以使用IFNULL代替COALESCE,因为只有一个值需要计算


使用左连接并将空值替换为零,如下所示:

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

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

实际上是这样。但现在我是手动使用的。是的,它在实际表格中显示2013-02-20。但是因为如果我写在这里太长了,我会编辑它。不,它没有任何意义。杰克,在结果中如何把0变成破折号?
SELECT CLAIMED.claimed, IFNULL(ADDED.added, 0), CLAIMED.date 
FROM CLAIMED JOIN ADDED ON CLAIMED.date=ADDED.date