我有两个不同的表:第一个表用于为声明其产品的用户发送数据
+---+-----------+----------+--------+
|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中执行此操作吗?提前致谢。
答案 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()
,因为只有一个要评估的值。
答案 1 :(得分:0)
使用LEFT JOIN并用零替换NULL,如下所示:
SELECT CLAIMED.claimed, IFNULL(ADDED.added, 0), CLAIMED.date
FROM CLAIMED JOIN ADDED ON CLAIMED.date=ADDED.date
我使用了大写字母表名,因为你没有指定它们。